我正在尝试使用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