让我们假设我是一个有着坏习惯的懒惰程序员(他也碰巧不知道plyr / dplyr),我喜欢做这样的操作:
`[<-`((z<-reshape2::melt(iris)), z[,"value"]>5, 3, 100)
熔化iris
,然后将值100分配给value
大于5的行,然后返回所有行,而不仅仅是选定的行。 ?"["
与replace()
相同的代码(几乎相同)
z[,"value"] <- replace(i <- ((z <- reshape2::melt(iris))[,"value"]), i > 5, 100)
1)但问题是:有没有办法使用标准括号表示[<-
来调用iris[<-, blah, blah, blah, ?]
函数?
2016年7月编辑:所以此问题的目的不是复制操作。数据并不重要,这个例子并不重要,重塑数据的复杂方式并不重要。
答案 0 :(得分:3)
回答你的问题:当然不是。对于
iris[<-, blah, blah, blah, ?]
要工作,[
函数应该将另一个函数(或运算符)作为第二个参数,而[
是一个不允许这样的基元。
您可能会争辩说#34;但该功能称为[<-
&#34;。它不是。如果你写
x[i,j,...]
然后用第一个参数[
,第二个参数x
调用函数i
,依此类推。在您的代码行中,i
是函数<-
。赋值运算符确实是一个函数:
> `<-`
.Primitive("<-")
> `<-`("x",1)
> x
[1] 1
所以你在那一行写的,归结为:
`[`(iris, <-, blah, blah ... )
这将在R的翻译中出错;赋值运算符被解释为尝试赋值。这显然是无效的代码。
您可能会建议使用反引号,因此它变为:
iris[`<-`, blah, blah, ... ]
转换为
`[`(iris, `<-`, blah, blah ,... )
但这也是原始[
不会也永远不会允许的。
有些人建议你可以编写自己的方法,而且你可以 - 你自己定义的课程。但是,您无法重新定义[
本身以允许任何通用数据框,除非您重写R解释器以将您的构造识别为[<-
而不是[
。