有没有办法在`[`形式?中调用`[<-`函数?

Vlo*_*Vlo 13 r function

让我们假设我是一个有着坏习惯的懒惰程序员(他也碰巧不知道plyr/dplyr),我喜欢做这样的操作:

`[<-`((z<-reshape2::melt(iris)), z[,"value"]>5, 3, 100)
Run Code Online (Sandbox Code Playgroud)

熔化iris,然后将值100分配给value大于5的行,然后返回所有行,而不仅仅是选定的行.该功能在页面上描述?"["

相同的代码replace()(几乎相同)

 z[,"value"] <- replace(i <- ((z <- reshape2::melt(iris))[,"value"]), i > 5, 100)
Run Code Online (Sandbox Code Playgroud)

1)但问题是:有没有办法[<-使用标准括号表示法调用函数iris[<-, blah, blah, blah, ?]

编辑2016年7月:所以这个问题的目的不是复制操作.数据并不重要,例子无关紧要,重塑数据的复杂方式无关紧要.

Jor*_*eys 3

回答你的问题:当然不是。为了

iris[<-, blah, blah, blah, ?]
Run Code Online (Sandbox Code Playgroud)

为了工作,该[函数应该接受另一个函数(或运算符)作为第二个参数,并且[是不允许这样做的原语。

您可能会争辩“但该函数被称为[<-”。它不是。如果你写

x[i,j,...]
Run Code Online (Sandbox Code Playgroud)

然后你[用第一个参数x、第二个参数i等等调用一个函数。在您的代码行中,i是函数<-. 赋值运算符确实是一个函数:

> `<-`
.Primitive("<-")
> `<-`("x",1)
> x
[1] 1
Run Code Online (Sandbox Code Playgroud)

因此,您在该行中所写的内容可以归结为:

`[`(iris, <-, blah, blah ... )
Run Code Online (Sandbox Code Playgroud)

这会在 R 的解释器中给出错误;赋值运算符被解释为尝试分配某些内容。这显然是无效的代码。

您可能建议使用反引号,这样它就变成:

iris[`<-`, blah, blah, ... ]
Run Code Online (Sandbox Code Playgroud)

这翻译成

`[`(iris, `<-`, blah, blah ,... )
Run Code Online (Sandbox Code Playgroud)

但这也是原始人所不允许的,也永远不会允许的[

有些人建议您可以编写自己的方法,并且您可以 - 对于您自己定义的类。但是您不能重新定义[自身以允许任何通用数据帧这样做,除非您重写 R 解释器以将您的构造识别为对[<-而不是 的调用[