在函数中使用curl-curly运算符时出错

时间:2019-07-07 21:23:40

标签: r

我正在尝试创建一个对数据进行Kruskal Wallis测试的函数,但是具有不同的分组类别。我试图创建的函数将能够使用感兴趣的不同分组类别的名称。我将我的代码基于类似这里的问题:

R: Kruskal-Wallis test in loop over specified columns in data frame

我正在尝试使用rlang 0.4包中的新curl-curly运算符。

https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/

以下是我的问题的一个示例:

library(dplyr)
library(broom)
set.seed(123)

df <- tbl_df(data.frame(
  group_cat1 = as.factor(rep(c("a", "b", "c"), each = 5)),
  group_cat2 = as.factor(rep(c("x", "y", "z"), each = 5)),
  var1   = runif(15, 0, 10),
  var2    = runif(15, 0, 10),
  var3   = runif(15, 0, 10)))

models_df <- df %>% 
  gather(variable, result, -group_cat1) %>% 
  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.$group_cat1) %>% tidy())

这很好用,但是,如果我尝试通过定义一个函数来概括问题,我将无法使其正常工作。

get_linear_model <- function(group_category) {
  df %>% 
    gather(variable, result, -{{group_category}}) %>% 
  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
}

我收到以下错误

Error: unexpected '{' in:
"  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.${"

我相信关于环境或通常如何使用这个新的curl-curly运算符,我缺少一些东西。我有点迷茫,因此不胜感激!

1 个答案:

答案 0 :(得分:0)

对于第二种情况,我们可以使用[[并将其转换为字符串,因为$不能正常工作

get_linear_model <- function(group_category) {

  df %>% 
    gather(variable, result, -{{group_category}}) %>% 
    group_by(variable) %>% 
    do(kruskal.test(x = .$result, 
       g = .[[rlang::as_name(enquo(group_category))]]) %>% 
            tidy())
    }

models_df2 <- get_linear_model(group_cat1)
identical(models_df, models_df2)
#[1] TRUE

在OP的代码中,错误是由于括号不平衡引起的

 ...
  do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
                                     ^^^            ^^^
                                      2              1