首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R/ nse /将变量双重移交给子函数

R/ nse /将变量双重移交给子函数
EN

Stack Overflow用户
提问于 2020-01-16 01:44:08
回答 1查看 46关注 0票数 0

我有两个函数,为了便于使用,我想把它们包装在一个包装函数中。包装函数包括一个变量(dataframe中的列名),它应该从包装函数传递给子函数之一。

强缩减示例:

子功能1:创建数据

代码语言:javascript
复制
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:绘图

代码语言:javascript
复制
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
}

包装函数

代码语言:javascript
复制
wrapfun <- function(gvar) {

    dat <- datafun()
    plot <- plotfun(df = dat, gvar = {{gvar}})

    plot
}

测试

直接使用这两个子函数是没有问题的:

代码语言:javascript
复制
#works
d <- datafun()
plotfun(d, gvar = ga)

但是,使用包装函数会导致错误

代码语言:javascript
复制
# doesn't work
wrapfun(gvar = ga)
>Error in FUN(X[[i]], ...) : object 'ga' not found

请注意(据我所知),directlabels::geom_dl不接受aes_string作为变通方法。因此,我似乎不能将gvar作为字符串传递给函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-16 03:25:45

在最新版本的ggplot中,您不使用deparse/substituteaes_string。您将以独占方式使用新的准索引语法。在这个示例中,您应该只做

代码语言:javascript
复制
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()中工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59756925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档