【问题标题】:Using standard evaluation with a udf in dplyr在 dplyr 中使用带有 udf 的标准评估
【发布时间】:2017-01-13 12:32:31
【问题描述】:

我正在使用 dplyr 进行编程,因此我使用的是标准评估。我使用数据框和列名作为参数创建了一个通用函数。在函数中,我想应用我自己在数据框列上编写的另一个函数。这是一个最小的例子:

some_udf <- function(x) mean(x + 3)
generic_function <- function(dat, input_var){
  dat %>% dplyr::summarise_(mean_3 = sprintf("some_udf(%s)", input_var))
}

现在在运行泛型函数时,我会收到以下错误:

generic_function(mtcars, 'cyl')

Error: could not find function "some_udf"

some_udf 被基本 R 函数替换时,例如 meansd,一切正常。

有人可以向我解释为什么 udf 在这种情况下不起作用以及可能的解决方案是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这本质上是 this question 的副本,它没有公认的答案,但正如 David Arenburg 和 MrFlick 在 cmets 中指出的那样,您需要将表达式作为公式传递,以便正确的环境上下文可用:

    library(dplyr)
    
    some_udf <- function(x) mean(x + 3)
    generic_function <- function(dat, input_var){
        dat %>% 
            summarise_(mean_3 = as.formula(sprintf("~some_udf(%s)", input_var)))
    }
    
    generic_function(mtcars, 'cyl')
    #   mean_3
    # 1 9.1875
    

    【讨论】:

    • 确实是重复的,谢谢指出。我将删除此帖子。
    • @Edwin 不,您实际上应该保留这篇文章。由于另一个问题没有任何答案,因此不能作为重复引用。
    • 好吧,那我就不说了:)
    【解决方案2】:

    阅读nse vignette并使用推荐的interp方法:

    generic_function <- function(dat, input_var){
      dat %>% 
        dplyr::summarise_(mean_3 = lazyeval::interp(~some_udf(x), x = as.name(input_var)))
    }
    
    generic_function(mtcars, 'cyl')
    
      mean_3
    1 9.1875
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      相关资源
      最近更新 更多