【问题标题】:Argument placeholder for base R pipe |>基本 R 管道的参数占位符 |>
【发布时间】:2021-12-20 01:38:46
【问题描述】:

我试图了解|> 的工作原理,以及它与magrittr %>% 的比较。 考虑下面的代码,看/调试相当不爽:

toy <- data.frame(a = c(1,2,3), type = c("apple", "pear", "orange"))

set.seed(1)
subset(toy, type == "apple")[sample(nrow(subset(toy, type == "apple")), 1),]
#>   a  type
#>   1 1 apple

|&gt; 的文档说:

管道符号允许以某种方式编写嵌套的调用序列 这可能会使处理步骤的顺序更容易遵循。

这让我相信类似的东西

toy |>
  subset(type == "apple") |>
  `[.data.frame`(sample(nrow(.), 1),)

是可能的,但不起作用,因为点在这里毫无意义。注意,[.data.frame 似乎绕过了|&gt; 的 RHS 的 [ 限制。我试图通过在控制台中运行*backtick*|&gt;*backtick* 来查找|&gt; 的源代码,但结果是Error: object '|&gt;' not found

使用magrittr 管道,可以像这样使用占位符.

library(magrittr)
toy %>%
  subset(type == "apple") %>%
  `[`(sample(nrow(.), 1),)
#>   a  type
#>   1 1 apple

问题

如何使用基本 R 管道 |&gt; 正确编写嵌套调用?

【问题讨论】:

  • toy |&gt; subset(type == "apple") |&gt; {\(.) ``[.data.frame``(sample(nrow(.), 1),)}()
  • @Eyaaw 使用{ 会导致错误:toy |&gt; {} >> { is not supported in RHS of |&gt;
  • toy |&gt; subset(type == "apple") |&gt; (function(x) {x[sample(nrow(x), 1), ]})()
  • 它对我有用。试试这个例子:mtcars|&gt; subset(am == 1) |&gt; {\(.) ``[.data.frame``(., sample(nrow(.), 1), )}()
  • |&gt; 没有源代码。与%&gt;% 不同,它不是那种意义上的运算符。它完全由解析器处理。如果您执行deparse(quote(toy |&gt; subset(type == "apple"))) 之类的操作,您可以看到这一点,它会给出"subset(toy, type == \"apple\")"

标签: r pipe


【解决方案1】:
toy <- data.frame(a = c(1,2,3), type = c("apple", "pear", "orange"))

set.seed(1)

toy |> subset(type == "apple") |> 
(\(x) x[sample(nrow(x), 1), ])()
 a  type
1 1 apple

toy |> subset(type == "apple") |> 
(\(x) `[.data.frame`(x, sample(nrow(x), 1), ))()
 a  type
1 1 apple

【讨论】:

  • 构造和调用匿名函数确实有效,感谢您的回答。说“基本 R 管道本身不支持占位符参数,但可以通过制定和调用匿名函数来构造它们”是否正确?另外-我有点困惑为什么|&gt; 之后的( 不会引发错误。 (function 不支持单独作为 RHS,但一起使用它可以工作
  • 是的,到目前为止,基础管道 Op 不支持占位符。您可以使用Sys.setenv 打开一个实验性占位符选项。请查看this SO 答案。您可以交替使用{( 作为分隔符。
猜你喜欢
  • 2022-01-13
  • 2014-03-13
  • 2022-08-23
  • 2016-08-11
  • 2023-01-14
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多