Поскольку нестандартная оценка изменяет правила области видимости незаметным образом, вы не можете просто передать переменные в вызовы aes()
или vars()
внутри функций (нотация ~ formula
обертывает vars()
). Более подробное описание этой проблемы вы можете найти здесь: https://ggplot2.tidyverse.org/articles/ggplot2-in-packages.html
Одно из решений - заключить ваши имена переменных в {{...}}
, что означает, что нестандартная оценка должна встречаются с любым выражением, указанным в качестве аргумента, вместо оцененного значения выражения аргумента.
library(ggplot2)
day <- c(0, 3, 5, 7, 9, 14, 0, 3, 5, 7, 9, 14)
value <- c(0.0, 3.6, 6.7, 7.6, 8.7, 0.0, 0.0, 1.0, 1.2, 8.3, 1.2, 0.0)
ID <- as.factor(c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2))
df <- data.frame(ID, day, value)
fun <- function(data, x, y, fac){
p <- ggplot(df, aes({{x}}, {{y}})) + geom_line()
p + facet_wrap(vars({{fac}}))
}
fun(df, day, value, ID)
Создано 27 мая 2020 г. пакет репекс (v0.3.0)
Также обратите внимание, что вы также должны заключить в двойные скобки переменные x
и y
. Единственная причина, по которой это работало раньше, заключалась в том, что day
и value
были переменными в глобальной среде (и имели длину nrow(df)
). Следующее возвращает ошибку при запуске в чистой среде:
library(ggplot2)
df <- data.frame(
ID = as.factor(c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)),
day = c(0, 3, 5, 7, 9, 14, 0, 3, 5, 7, 9, 14),
value = c(0.0, 3.6, 6.7, 7.6, 8.7, 0.0, 0.0, 1.0, 1.2, 8.3, 1.2, 0.0)
)
fun <- function(data, x, y, fac){
p <- ggplot(df, aes(x, y)) + geom_line()
p + facet_wrap(vars({{fac}}))
}
fun(df, day, value, ID)
#> Error in FUN(X[[i]], ...): object 'day' not found
Создано 27.05.2020 с помощью пакета реплекс (v0.3.0)