ggplot обрабатывает переменную в кавычках

Я столкнулся с неожиданной проблемой при создании графика ggplot() после операций, выполненных с фреймом данных. Привожу наглядный пример:

func <- function(){  
library(ggplot2)
df <- read.table(....)
# perform operation on df to retrieve column of interest index/number
column.index <- regexpr(...)   
# now need to find variable name for this column
var.name <- names(df)[column.index]
# also need to mutate data in this column
df[,column.index] <- df[,column.index] * 10
# generate plot
plot <- ggplot(data, aes(x=var.name))+geom_bar()
print(plot)
}

Здесь ggplot выдаст ошибку, так как var.name заключено в кавычки, например, «миль на галлон». Любая идея, как решить эту проблему?

Изменить: проверенные решения из этот вопрос не помогли.


person remi    schedule 18.10.2015    source источник
comment
@ Дэвид: Я протестировал quote как в NSE, поэтому я добавил тег, чтобы дать подсказку о характере проблемы.   -  person remi    schedule 18.10.2015
comment
Попался. Быстрый набор текста и размышление, думал, что я это написал :-)   -  person remi    schedule 18.10.2015


Ответы (2)


Используйте aes_string, что позволяет передать строковое имя для переменной.

person smci    schedule 18.10.2015
comment
@ smci: спасибо за предложение. aes_string будет работать только в том случае, если var.name будет обрезано из кавычек: например: var = as.name(var.name) - person remi; 18.10.2015

Вы можете использовать пакет «dplyr», чтобы переименовать столбец var.name во что-то общее (x), а затем построить график на x:

# also need to mutate data in this column
df[,column.index] <- df[,column.index] * 10
# ***NEW*** re-name column to generic name
df <- rename_(df, .dots=setNames(list(var.name), 'x'))
# generate plot
plot <- ggplot(df, aes(x=x))+geom_bar()
person easports611    schedule 18.10.2015
comment
а затем добавьте +xlab(var.name) в конце вызова графика, чтобы переименовать ось - person easports611; 18.10.2015
comment
более простой способ сделать шаг переименования df <- rename_(df, x = var.name) - person easports611; 18.10.2015
comment
Это взлом; используйте aes_string(), для этого он и нужен - person smci; 18.10.2015