r-如何编写自定义管道友好函数



我正在尝试使用magrittr创建管道友好函数

例如,我试图编写一个自定义函数来计算列的平均值:

library(magrittr)
custom_function <-
function(.data, x) {
mean(.data$x)
}
mtcars %>%
custom_function(mpg)

但我得到了这个错误:

Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x,  : 
object 'mpg' not found

也许我对变量的引用不起作用。如何修复此.data$x

.data$x不是指名称保存在变量x中的列,而是指名为"x"的列。使用.data[[x]]引用名称为变量x中的字符串的列,并使用字符串"mpg"调用函数。

library(magrittr)
custom_function <- function(.data, x) mean(.data[[x]])
mtcars %>% custom_function("mpg")
## [1] 20.09062

base R中,我们可以将$更改为[[,并使用deparse/substitute将未引用的列名转换为character

custom_function <- function(.data, x) {
mean(.data[[deparse(substitute(x))]])
}

现在,我们应用功能

mtcars %>%
custom_function(mpg)
#[1] 20.09062

$的问题在于,它实际上是在检查列名"x",而没有存储关联值。因此,它失败并返回NULL


使用tidyverse,我们可以使用卷曲-卷曲运算符({{}}(在summarise中进行求值。由于我们只需要一个汇总输出,summarise可以返回该单个值,而如果我们需要在原始数据集中创建一个新列,则需要mutate。在我们创建汇总列之后,只将该列pull作为vector

custom_function <- function(.data, x) {
.data %>%
summarise(out = mean({{x}})) %>%
pull(out)
}
mtcars %>% 
custom_function(mpg)
[1] 20.09062

相关内容

  • 没有找到相关文章

最新更新