2

我正在尝试在magrittr. 第一次尝试:

1:3 %>% (function(x) {x[1] <- 42; x})
#[1] 42  2  3  

使用以下选项的较短选项l

1:3 %>% (l(x ~ {x[1] <- 42; x}))
#[1] 42  2  3

我想知道是否可以在不需要定义任何 lambda 的情况下进行相同的操作。最短的方法是什么?我可以为此使用赋值运算符<-和占位符.吗?类似于(注意可读性)

1:3 %>% {.[1] <- 42} # invisible 42 instead

我知道最后的结果是自然的(操作符无形地返回值)。怎么能绕过呢?

4

3 回答 3

3

尝试以下操作:

> 1:3 %>% replace(1, 42)
[1] 42  2  3
于 2014-07-11T12:34:33.500 回答
2

这些管道的主要想法是使事物具有可读性,并且将函数定义内联在一定程度上取消了这一点。我宁愿在管道外定义一个函数并使用它:

> fidge=function(x,n,v){x[n]=v;x}
> 1:3 %>% fidge(1,42)
[1] 42  2  3

特别是如果您打算在多个地方执行此操作!

如果你真的想在这里打代码高尔夫,怎么样:

> 1:3 %>% "[<-"(1,42)
[1] 42  2  3
于 2014-07-11T09:39:36.817 回答
1

使用 eg data.frames,该within函数可能很有用:

iris %>%
  within({
    Sepal.Length <- 10
    Width.Square <- Sepal.Width^2
  }) 

dplyr::mutate虽然,如果效率和速度是一个问题,人们也可以使用这个特定的任务。

within也适用于列表:

list(a = 1, b = 2) %>%
  within({
    a = 3
    d = 4
  })

@Spacedman:也许可以添加一些别名 ala extract(用于[[<-以使您的高尔夫示例更好:)

编辑:在 v1.5 别名中inset,分别inset2添加了[<-[[<-

于 2014-07-13T18:08:21.653 回答