让我们假设我是一个有着坏习惯的懒惰程序员(他也碰巧不知道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 解释器以将您的构造识别为对[<-而不是 的调用[。
| 归档时间: |
|
| 查看次数: |
844 次 |
| 最近记录: |