函数在 tibble 中找不到列名

Function can't find column name in tibble

我正在尝试创建一个使用 dplyr 语法来操作数据的函数,但该函数找不到列名。

    # example code below
    library(dplyr)
    

    # create sample data
    ex.dat = data.frame(ex.IV = c(rep(1,50),
                          rep(2,50)), 
                  ex.DV = c(rnorm(n = 50, mean = 100, sd = 15),
                         rnorm(n = 50, mean = 115, sd = 15)))
    

    # create simple function that finds mean and sd from sample data
    ex.func = function(data,predictor,predicted){
      as.tibble(data) %>%
        group_by(predictor) %>%
        summarise(
          M = mean(predicted),
          SD = sd(predicted)
        )
    }
    
    # run function with sample data
    ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)

这会产生以下错误:“错误:必须按在 .data 中找到的变量分组。未找到列 predictor。”

我不明白为什么函数没有将 ex.IV 分配给 predictor

运行同样的代码,不涉及函数,当然没有问题,例如

    as.tibble(ex.dat) %>%
     group_by(ex.IV) %>%
     summarise(
       M = mean(ex.DV),
       SD = sd(ex.DV))

产生了预期的结果,所以问题一定出在函数格式上。

解决方法如:

ex.func(data = ex.dat, predictor = ex.dat$ex.IV, predicted = ex.dat$ex.DV)
ex.func(data = ex.dat, predictor = data$ex.IV, predicted = data$ex.DV)

收到相同的错误。

显然我不理解 function() 的一些基本操作。我会很感激一些指示。

我们可以使用 curly-curly ({{}}) 运算符,因为输入参数不带引号

ex.func <- function(data, predictor, predicted){
      as.tibble(data) %>%
        group_by({{predictor}}) %>%
        summarise(
          M = mean({{predicted}}),
          SD = sd({{predicted}})
        )
    }

现在运行为

ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)

如果我们需要灵活的选项是传递的参数可以被引用或不被引用,那么我们可能需要使用 ensym 转换为符号并评估 (!!

ex.func <- function(data, predictor, predicted){
     predictor <- rlang::ensym(predictor)
     predicted <- rlang::ensym(predicted)
      as.tibble(data) %>%
        group_by(!!predictor) %>%
        summarise(
          M = mean(!!predicted),
          SD = sd(!!predicted)
        )
    }

然后,我们可以将两者都称为

ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)

ex.func(data = ex.dat, predictor = "ex.IV", predicted = "ex.DV")