是否有一种方法可以在`[`形式中调用`[<-`函数?

13

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

`[<-`((z<-reshape2::melt(iris)), z[,"value"]>5, 3, 100)

iris融化,然后将值大于5的行的value赋值为100,然后返回所有行,而不仅仅是选择的行。该函数在?"["页面上有描述。

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

 z[,"value"] <- replace(i <- ((z <- reshape2::melt(iris))[,"value"]), i > 5, 100)

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

编辑于2016年7月:所以这个问题的目的不是为了复制操作。数据无关紧要,示例无关紧要,重新整理数据的复杂方式也无关紧要。


1
你可以定义一个函数 \[.myClass` <- function(stuff) assign(stuff)或者类似的内容,然后执行class(iris) <- "myClass"`。 - Rich Scriven
8
也许程序员应该停止懒惰,多投入一些工作……哈哈 :) - Rich Scriven
1
\[<-`(z=reshape2::melt(iris),z[3]>5,3,100)` 用 fewer keystrokes 可以实现相同的功能。我不知道这有什么意义。"function using using the standard.." 是什么意思?你是指 "without using?" 如果你只是在玩代码高尔夫,那就另当别论了。但是,计算出执行某些操作所需的最少按键次数似乎是一个容易出错的浪费时间的做法,而且将多个步骤合并成一个脚本会使调试变得更加困难。这样做并不能节省大量时间。 - rawr
7
我也很难理解为什么你要把那么多东西塞进一个难以理解的语句中。我的建议是within(reshape2::melt(iris), value[value > 5] <- 100) - flodel
2
那么 iris[iris > 5] <- 100 怎么样?我的意思是你需要长格式吗?如果是这种情况,你应该使用长数据框重新制定问题,作为一个例子。 - Karl Forner
显示剩余9条评论
1个回答

3
回答你的问题:当然不是。
iris[<-, blah, blah, blah, ?]

工作时,[函数应该将另一个函数(或运算符)作为第二个参数,但[是一种原始的函数,不允许这样做。
你可能会说,“但这个函数被称为[<- ”。实际上不是这样的。如果你写
x[i,j,...]

然后您调用一个函数[,第一个参数为x,第二个参数为i等等。在您的代码行中,i是函数<-。赋值运算符确实是一个函数:
> `<-`
.Primitive("<-")
> `<-`("x",1)
> x
[1] 1

你所写的那行话,归结起来就是:
`[`(iris, <-, blah, blah ... )

这段话的意思是:“这样会导致R解释器报错;赋值操作符被解释为试图分配某个值,显然这是无效的代码。你可以尝试使用反引号将其修改成:”
iris[`<-`, blah, blah, ... ]

这翻译成了
`[`(iris, `<-`, blah, blah ,... )

但同时,这也是原始[不允许的事情,而且永远不会允许。
有些人建议你可以编写自己的方法,并且对于你自己定义的类,确实可以这样做。但是除非你重新编写R解释器以将你的结构识别为对[<-的调用而不是[,否则你不能重新定义[本身以允许这种方式操作任何通用数据框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接