用户定义函数难以在 R 中对多个变量执行操作

Difficulty with user-defined function to perform operation on multiple variables in R

提问人:marcel 提问时间:7/28/2023 最后编辑:jpsmithmarcel 更新时间:7/28/2023 访问量:43

问:

我正在对数据帧中的变量进行 t 检验:

library(rstatix)

df <- data.frame(grouping = c(rep("left", 50), rep("right", 50)), 
                 var1 = (rnorm(100, mean=21, sd=3)))

var1_result <- df %>% 
  t_test(var1 ~ grouping, paired = TRUE, detailed = TRUE) %>% 
  rstatix::add_significance()

var1_result 

我为每个变量使用重复的代码行,但希望通过调用用户定义的函数来改进。我试过了

my_t_test <- function(dataset, parameter, grouping_variable) {
  parameter <- dataset %>% t_test({{parameter}} ~ {{grouping_variable}}, paired = TRUE, detailed = TRUE) %>% add_significance()
  return(parameter)
}
my_t_test(df, var1, grouping)

但是,我遇到了错误:“错误:!无法提取不存在的列。✖ 列不存在。pull()...

我发现了一些帖子,解决了在以 dplyr 风格编写的函数中调用 df 变量的问题(例如,如何在 R 中编写一个接受 dplyr 等列名的函数? )

我尝试了用“...”来编写函数的方法。相反,正如第一篇文章所建议的那样,但这不起作用,并且难以从其他帖子中推广任何解决方案。非常有兴趣在使用 dplyr 时了解有关使用用户定义函数的正确表示法和范围的更多信息

r 用户定义函数 范围 rstatix

评论


答:

0赞 MrFlick 7/28/2023 #1

尝试将表达式放入公式时需要更加小心,因为公式的左侧和右侧未计算。一种可能的解决方法是{{}}

my_t_test <- function(dataset, parameter, grouping_variable) {
  formula <- do.call("~", list(rlang::enexpr(parameter), rlang::enexpr(grouping_variable)))
  parameter <- dataset %>% t_test(formula, paired = TRUE, detailed = TRUE) %>% add_significance()
  return(parameter)
}

在这里,我们调用函数来构建公式并用于捕获适当的符号。~enexpr

这应该产生相同的输出

my_t_test(df, var1, grouping)
# A tibble: 1 × 14
  estimate .y.   group1 group2    n1    n2 stati…¹     p    df conf.…² conf.…³ method
     <dbl> <chr> <chr>  <chr>  <int> <int>   <dbl> <dbl> <dbl>   <dbl>   <dbl> <chr> 
1    0.114 var1  left   right     50    50   0.162 0.872    49   -1.30    1.53 T-test
# … with 2 more variables: alternative <chr>, p.signif <chr>, and abbreviated
#   variable names ¹​statistic, ²​conf.low, ³​conf.high
# ℹ Use `colnames()` to see all variable names

请注意,这不是标准的 R 语法,仅适用于用作后端的包(主要是“tidyverse”中的包)。碰巧在后端使用{{}}rlangrstatix::t_testdplyr

评论

0赞 marcel 7/28/2023
这似乎有效,但 rlang.r-lib.org/reference/defusing-advanced.html 有一些关于使用“enexpr”的温和警告语言,说:“ enexpr() 和 enexprs() 类似于 enquo() 和 enquos(),但返回裸表达式而不是 quosures。这些运算符应该很少使用,因为它们会跟踪化解参数的环境。使用这种方法有风险吗?
0赞 MrFlick 7/28/2023
我不确定为什么你可能会提到“风险”类型。但是在这种情况下,您正在尝试将这些参数作为符号名称传递,您明确不希望调用环境,因为您希望在数据框中查找这些符号。