Как уже правильно ответили Джорис и Чейз, стандартная лучшая практика - просто пропустить часть meansdf$
и напрямую ссылаться на столбцы фрейма данных.
testplot <- function(meansdf)
{
p <- ggplot(meansdf,
aes(fill = condition,
y = means,
x = condition))
p + geom_bar(position = "dodge", stat = "identity")
}
Это работает, потому что переменные ссылаются нав aes
ищутся либо в глобальной среде, либо во фрейме данных, переданном в ggplot
.Это также причина, по которой ваш пример кода - с использованием meansdf$condition
и т. Д. - не работал: meansdf
не доступен ни в глобальной среде, ни недоступен во фрейме данных, переданном в ggplot
, то есть meansdf
сама.
Тот факт, что переменные ищутся в глобальной среде, а не в вызывающей среде, на самом деле известная ошибка в ggplot2 , которую Хэдли не считает исправимоймоментЭто приводит к проблемам, если кто-то хочет использовать локальную переменную, скажем, scale
, чтобы влиять на данные, используемые для графика:
testplot <- function(meansdf)
{
scale <- 0.5
p <- ggplot(meansdf,
aes(fill = condition,
y = means * scale, # does not work, since scale is not found
x = condition))
p + geom_bar(position = "dodge", stat = "identity")
}
Очень хороший обходной путь для этого случая предоставлен Уинстоном Чангом.в упомянутой проблеме GitHub: явное задание параметра environment
для текущей среды во время вызова ggplot
.Вот как это будет выглядеть для приведенного выше примера:
testplot <- function(meansdf)
{
scale <- 0.5
p <- ggplot(meansdf,
aes(fill = condition,
y = means * scale,
x = condition),
environment = environment()) # This is the only line changed / added
p + geom_bar(position = "dodge", stat = "identity")
}
## Now, the following works
testplot(means)