2 |> setdiff(1:3, _)
#Error: pipe placeholder can only be used as a named argument
2 |> setdiff(1:3, y = _)
#[1] 1 3
2 |> (\(.) setdiff(1:3, .))()
#[1] 1 3
2 %>% setdiff(1:3, .)
#[1] 1 3
2 %>% setdiff(1:3, y = .)
#[1] 1 3
同样,对于带有...(点-点-点)参数的变元函数,占位符_需要用作命名参数。
"b" |> paste("a", _, "c")
#Error: pipe placeholder can only be used as a named argument
"b" |> paste("a", . = _, "c")
#[1] "a b c"
"b" |> (\(.) paste("a", ., "c"))()
#[1] "a b c"
5条答案
按热度按时间zwghvu4y1#
在R4.1中,没有本地管道的占位符语法,因此,不存在magrittr的
.
占位符的等价物,因此以下内容不可能在|>
中执行。从R 4.2开始,原生管道可以使用
_
作为占位符,但 * 只能使用命名参数 *。.
和magrittr仍然更加灵活,因为.
可以重复出现在表达式中。同样不清楚的是,如何将
|>
与一个接受未命名可变参数(即...
)的函数一起使用,在这个paste()
示例中,我们可以构造x
和y
参数,以将占位符骗到正确的位置,但这感觉有点笨拙。以下是解决保持器限制的其他方法-
1.编写单独的函数
1.使用匿名函数
a)使用“旧”语法
B)使用 new 匿名函数语法
1.按名称指定第一个参数。这依赖于本地管道连接到第一个 * 未命名 * 参数的事实,因此如果您为第一个参数提供名称,它将“溢出”到第二个参数(如果按名称指定多个参数,则依此类推)
xxe27gdn2#
在R 4.1.0中添加的基本R管道
|>
“只是”进行函数组合。也就是说,我们可以看到它的使用 really 与函数调用是一样的:这产生了一些后果:
sum()
在这里需要括号才能正确调用这可能导致使用当前“可用但未激活”的
=>
(您需要为此设置环境变量_R_USE_PIPEBIND_
,并且在R 4.2.0中可能会更改)。(This第一次提供是作为复制这个over here的问题的答案,我只是按照建议复制了它。)
=>
”出现,这里是一个快速的后续问题。* 请注意,此操作符可能会更改。*deparse(substitute(...))
在这里特别好。lfapxunr3#
| 题目|马格利特 * 2.0.3 |基础 * 4.2.0 |
| - ------|- ------|- ------|
| * * 操作员|
%>%
||>
|| * * 函数调用**|
1:3 %>% sum()
|1:3 |> sum()
|| |
1:3 %>% sum
|* 需要括号 || |
mtcars %>%
$(cyl)
| 不支持某些功能 || 在第一个空白位置插入|
mtcars %>% lm(formula = mpg ~ disp)
|mtcars |> lm(formula = mpg ~ disp)
|| * * 占位符*|
.
|_
|| |
mtcars %>% lm(mpg ~ disp, data = . )
|x1米11米1x|| |
mtcars %>% lm(mpg ~ disp, . )
|* 需要命名参数 || |
1:3 %>% setNames(., .)
| 只能出现一次 || |
1:3 %>% {sum(sqrt(.))}
| 不允许嵌套调用 || |
mtcars %>% .$cyl
| 管道占位符的使用无效 但在这个例子中mtcars$cyl
|| * * 环境*|* 附加功能环境 |
"x" |> assign(1)
|| * * 速度*|较慢,因为 * 函数调用的开销 *|更快,因为 * 语法转换 *|
将
|>
与(匿名)函数结合使用时,许多差异和限制都消失了:1 |> (\(.) .)()
x1米20英寸1x
有些函数*不受支持,但有些仍然可以通过将其放在括号中、通过函数
::
调用、在函数中调用或定义到函数的链接来调用。占位符需要命名参数
同样,对于带有
...
(点-点-点)参数的变元函数,占位符_
需要用作命名参数。占位符只能出现一次
无额外环境
其他可能性:
可以使用Bizarro管道
->.;
实现不同的管道操作符和不同的占位符,但该管道不是管道(请参见disadvantages),它将覆盖.
并且评估不同。
或定义一个自身运算符,该运算符的计算结果不同。
结果
wztqucjr4#
原生管道是作为语法转换实现的,因此
2 |> sqrt()
与sqrt(2)
相比没有明显的开销,而2 %>% sqrt()
则有一点损失。您可以看到传递给
microbenchmark
的表达式2 |> sqrt()
如何被解析为sqrt(2)
。omtl5h9j5#
一个区别是它们的占位符,
_
在碱基R中,.
在magrittr
中。从R 4.2.0开始,基本R管道有一个占位符
_
,类似于%>%
的.
,但是它的使用被限制在命名参数,并且每个调用只能使用一次。现在可以在rhs调用中使用带占位符_的命名参数来指定要插入lhs的位置。占位符在rhs上只能出现一次。
为了重复Ronak Shah的例子,现在可以使用
_
作为右边的命名参数来引用公式的左边:但它必须被命名为:
并且不能出现多于一次(为了克服这个问题,仍然可以使用Ronak Shah提供的解决方案):
虽然这在
magrittr
中是可能的: