【问题标题】:User-defined function with no arguments, in R, in pipe用户定义的无参数函数,在 R 中,在管道中
【发布时间】:2020-08-16 19:19:51
【问题描述】:

我想写一个没有参数的函数,并且可以在管道中引用(%>%),所以我不必重复几行代码。但是,多次尝试后我没有得到它。我也将感谢有关编写带有参数的管道中引用的函数的帮助。非常感谢您的帮助!简化示例如下:

library(tidyverse)
a <- c(1:10)
b <- c(11:20)
c <- data.frame(a, b)
c
#>     a  b
#> 1   1 11
#> 2   2 12
#> 3   3 13
#> 4   4 14
#> 5   5 15
#> 6   6 16
#> 7   7 17
#> 8   8 18
#> 9   9 19
#> 10 10 20
y <- function() {
  filter(d<5)
}

c %>% mutate(d = a*b) %>% y()
#> Error in y(.): unused argument (.)

reprex package (v0.3.0) 于 2020-08-16 创建

【问题讨论】:

    标签: r function pipe


    【解决方案1】:

    pipe 认为函数的第一个参数是数据,例如 mutate 或 filter 的第一个参数都是数据。因此,当您执行mtcars %&gt;% mutate(a = 5) 时,您实际上是在执行mutate(mtcars, a = 5)

    因此您必须将其修改为:

    y <- function(data) {
      filter(data, d < 80)
    }
    
    c %>% mutate(d = a*b) %>% y()
    
      a  b  d
    1 1 11 11
    2 2 12 24
    3 3 13 39
    4 4 14 56
    5 5 15 75
    

    【讨论】:

    • 是的,可以。对不起,我的例子不够清楚,太简单了。在我修改后的示例中,我是否在函数中引用 c 并不重要。问题是:一系列命令修改后的数据如何引用?
    • 我不确定我是否理解您想要的内容,但按照我回答的方式进行操作仍然适用于您的示例:y &lt;- function(data) { filter(data, d &lt; 80) }c %&gt;% mutate(d = a*b) %&gt;% y()。在这种情况下 y() 将获得变异的 c 作为第一个参数。
    • 是的,这是我需要的方式,非常感谢!我不清楚需要什么背后的理论,但我可以用你的答案来解决我的问题。
    • @David 你可以看看:r4ds.had.co.nz/pipes.html
    • 完成。再次感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2017-09-13
    相关资源
    最近更新 更多