微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何编写自定义管道友好函数?

我正在尝试使用 magrittr

创建 pipe-friendly functions

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

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 中,我们可以将 $ 更改为 [[,并使用 character 将未加引号的列名称转换为 deparse/substitute

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。