我有两个函数,为了便于使用,我想把它们包装在一个包装函数中。包装函数包括一个变量(dataframe中的列名),它应该从包装函数传递给子函数之一。
强缩减示例:
子功能1:创建数据
datafun <- function() {
df_data <- data.frame(x = rep(1:20, 3),
y = rnorm(60),
ga = sample(c("a", "b"), 30, replace = TRUE),
gb = sample(c("x", "y"), 20, replace = TRUE))
df_data
}子功能2:绘图
plotfun <- function(df, gvar) {
gvar_q = deparse(substitute(gvar))
g <- ggplot2::ggplot(df, ggplot2::aes_string(x = "x", y = "y", color = gvar_q)) +
ggplot2::geom_line() +
directlabels::geom_dl(ggplot2::aes(label = {{gvar}}), method = list("last.points"))
g
}包装函数
wrapfun <- function(gvar) {
dat <- datafun()
plot <- plotfun(df = dat, gvar = {{gvar}})
plot
}测试
直接使用这两个子函数是没有问题的:
#works
d <- datafun()
plotfun(d, gvar = ga)但是,使用包装函数会导致错误
# doesn't work
wrapfun(gvar = ga)
>Error in FUN(X[[i]], ...) : object 'ga' not found请注意(据我所知),directlabels::geom_dl不接受aes_string作为变通方法。因此,我似乎不能将gvar作为字符串传递给函数。
发布于 2020-01-16 03:25:45
在最新版本的ggplot中,您不使用deparse/substitute或aes_string。您将以独占方式使用新的准索引语法。在这个示例中,您应该只做
plotfun <- function(df, gvar) {
ggplot2::ggplot(df, ggplot2::aes(x = x, y = y, color = {{gvar}})) +
ggplot2::geom_line() +
directlabels::geom_dl(ggplot2::aes(label = {{gvar}}), method = list("last.points"))
}然后,您的函数将直接在wrapfun()中工作
https://stackoverflow.com/questions/59756925
复制相似问题