让我们假设我是一个有着坏习惯的懒惰程序员(他也碰巧不知道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月:所以这个问题的目的不是复制操作.数据并不重要,例子无关紧要,重塑数据的复杂方式无关紧要.
回答你的问题:当然不是。为了
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 解释器以将您的构造识别为对[<-
而不是 的调用[
。