在 R 用户定义函数中传递数据参数

Posted

技术标签:

【中文标题】在 R 用户定义函数中传递数据参数【英文标题】:Passing the Data Argument in R User Defined Functions 【发布时间】:2020-02-10 01:43:16 【问题描述】:

对于 R 中的 lm() 之类的函数,您将“数据”参数传递给函数,通常是一个数据框,然后 R 通过名称而不是引用它们来知道所有列。所以区别在于x=column,而不是引用时尚x=df$column。那么如何在我自己的用户定义函数中使用相同的方法呢?

一个简单的例子:

library(tidyverse)

df <- tibble(x=1:100,y=x*(1+rnorm(n=100)))

test_corr <- function(x,y) 
  cor(x,y) %>% return()


# Right now I would do this
test_corr(df$x,df$y)

# I want to be able to do this
test_corr(data=df, x, y)

【问题讨论】:

你能举个例子说明你想到的函数类型以及你想如何调用它吗? 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。 @camille 感谢您的反馈,我附上了我正在寻找的示例。 @MrFlick 感谢您的反馈,我附上了我正在寻找的示例。 【参考方案1】:

由于您使用的是tidyverse 函数,因此对此类任务使用整洁的评估是有意义的。对于这个功能,你可以做

test_corr <- function(data, x, y) 
  quo( cor(x, y) ) %>% 
    rlang::eval_tidy(data=data)


test_corr(df, x, y)

首先,我们确定构建您要评估的表达式,然后我们使用 (拥抱)语法将您传递给函数的变量名插入到表达式中。然后,我们会在您使用eval_tidy 提供的data.frame 的上下文中评估该quosure。

您可能还对tidyselect 包小插图感兴趣,其中讨论了更多选项。

【讨论】:

【参考方案2】:

你可以使用reformulate

apply_fun <- function(response, terms, data) 
   lm(reformulate(terms, response), data)


apply_fun("mpg", "cyl", mtcars)
#Call:
#lm(formula = reformulate(terms, response), data = data)

#Coefficients:
#(Intercept)          cyl  
#     37.885       -2.876  

apply_fun("mpg", c("cyl", "am"), mtcars)

#Call:
#lm(formula = reformulate(terms, response), data = data)

#Coefficients:
#(Intercept)          cyl           am  
#     34.522       -2.501        2.567  

【讨论】:

以上是关于在 R 用户定义函数中传递数据参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户定义的函数中将数据库列作为参数传递?

R - 在用户定义的函数 R 中将字符串作为字符串传递

将字符串传递给 R 函数参数,但稍后用作另一个函数的参数名称

何时使用缺失值与 NULL 值在 R 中传递未定义的函数参数,为啥?

带有 dplyr 的用户定义函数 - 变异列是一个参数

在 R 中,如何将参数作为字符串传递给像 plotXtabs2 这样的函数?