我是magrittr
/dplyr
的%>%
运算符的忠实粉丝,并尽可能使用它。但是,我在使用它通过管道连接到seq()
函数时遇到了问题。
举个简单的例子,假设我有一个变量x
,我想创建一个从x-5
到x+5
的序列。我可以这样做:
> x <- 10
> seq(from = x-5, to = x+5, by = 1)
[1] 5 6 7 8 9 10 11 12 13 14 15
但是对于我的生活,我无法让它与管道正常工作。为了说明这一点,让我稍微了解一下这个问题。假设x <- 10
.
管道在某些情况下工作...
以下示例以静默方式将10
管道传输到from
参数,并使用.
以及一些算术将to
参数设置为15
,按预期给出序列10:15
。
> x %>% seq(.+5)
[1] 10 11 12 13 14 15
我可以显式设置from
参数,如下所示,它也给出了相同的预期结果(10:15
):
> x %>% seq(from = ., to = .+5)
[1] 10 11 12 13 14 15
但在其他人身上不起作用...
现在对上一个示例稍作调整。我想尝试复制我的第一个示例并生成从x-5
到x+5
的序列。我希望我可以将from
参数设置为.-5
,但这并没有给出预期的结果:
> x %>% seq(from = .-5, to = .+5)
[1] 5 15
似乎from
和to
分别正确设置为5
和15
。但似乎by
参数已设置为.
(即10
) 给出意外结果5 15
而不是序列5:15
。
我可以尝试显式设置by
参数,但现在出现错误:
> x %>% seq(from = .-5, to = .+5, by = 1)
Error in seq.default(., from = . - 5, to = . + 5, by = 1) :
too many arguments
您可以在此处看到它做了什么,将.
管道传输到第一个参数,但是它也有我的三个显式参数要处理,并且错误结果。
它一直工作正常,直到我想在from
参数中使用.
进行一些算术。
有没有办法做我想做的事情,或者只是生活中某些功能与%>%
不完全兼容的事实?
您可以防止%>%
插入 . 到第一个参数中,方法是用大括号括起来的右侧:
10 %>% { seq(from = .-5, to = .+5) }
## [1] 5 6 7 8 9 10 11 12 13 14 15