【发布时间】: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
|> 的文档说:
管道符号允许以某种方式编写嵌套的调用序列 这可能会使处理步骤的顺序更容易遵循。
这让我相信类似的东西
toy |>
subset(type == "apple") |>
`[.data.frame`(sample(nrow(.), 1),)
是可能的,但不起作用,因为点在这里毫无意义。注意,[.data.frame 似乎绕过了|> 的 RHS 的 [ 限制。我试图通过在控制台中运行*backtick*|>*backtick* 来查找|> 的源代码,但结果是Error: object '|>' not found。
使用magrittr 管道,可以像这样使用占位符.:
library(magrittr)
toy %>%
subset(type == "apple") %>%
`[`(sample(nrow(.), 1),)
#> a type
#> 1 1 apple
问题
如何使用基本 R 管道 |> 正确编写嵌套调用?
【问题讨论】:
-
toy |> subset(type == "apple") |> {\(.) ``[.data.frame``(sample(nrow(.), 1),)}() -
@Eyaaw 使用
{会导致错误:toy |> {}>>{ is not supported in RHS of |> -
toy |> subset(type == "apple") |> (function(x) {x[sample(nrow(x), 1), ]})() -
它对我有用。试试这个例子:
mtcars|> subset(am == 1) |> {\(.) ``[.data.frame``(., sample(nrow(.), 1), )}() -
|>没有源代码。与%>%不同,它不是那种意义上的运算符。它完全由解析器处理。如果您执行deparse(quote(toy |> subset(type == "apple")))之类的操作,您可以看到这一点,它会给出"subset(toy, type == \"apple\")"。