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

时间:2014-12-16 22:21:43

标签: r function

让我们假设我是一个有着坏习惯的懒惰程序员(他也碰巧不知道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月编辑:所以此问题的目的不是复制操作。数据并不重要,这个例子并不重要,重塑数据的复杂方式并不重要。

1 个答案:

答案 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解释器以将您的构造识别为[<-而不是[