【问题标题】:Is there a way to call the `[<-` function in `[` form?有没有办法以`[`形式调用`[<-`函数?
【发布时间】:2014-12-16 22:21:43
【问题描述】:

假设我是一个有坏习惯的懒惰程序员(碰巧不知道 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[&lt;-, blah, blah, blah, ?] 调用[&lt;- 函数?

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

【问题讨论】:

  • 你可以定义一个函数`[.myClass` &lt;- function(stuff) assign(stuff)或者类似的东西然后class(iris) &lt;- "myClass"
  • 嗯,也许程序员应该停止如此懒惰并投入一些工作......哈哈:)
  • `[&lt;-`(z=reshape2::melt(iris),z[3]&gt;5,3,100) 会减少击键次数。我不知道为什么这很重要。 “使用标准的功能..”是什么意思?你的意思是“不使用”?如果您实际上是在玩代码高尔夫,那是一回事,但是找出做某事所需的最少击键次数似乎是一种容易出错的浪费时间,并且由于您组合了如此多的步骤,因此使脚本更难调试合而为一。这并没有节省大量时间
  • 我也很难理解你为什么要把这么多东西塞进一个难以理解的陈述中。我的建议是within(reshape2::melt(iris), value[value &gt; 5] &lt;- 100)
  • iris[iris > 5]

标签: r function


【解决方案1】:

回答你的问题:当然不是。对于

iris[<-, blah, blah, blah, ?]

要工作,[ 函数应该将另一个函数(或运算符)作为第二个参数,而 [ 是一个不允许这样做的原语。

您可能会争辩说“但该函数称为[&lt;-”。它不是。如果你写

x[i,j,...]

然后你调用一个函数[,第一个参数x,第二个参数i等等。在您的代码行中,i 是函数&lt;-。赋值运算符确实是一个函数:

> `<-`
.Primitive("<-")
> `<-`("x",1)
> x
[1] 1

所以你在那一行写的,归结为:

`[`(iris, <-, blah, blah ... )

这会导致 R 的解释器出错;赋值运算符被解释为尝试赋值。这显然是无效代码。

你可能会建议使用反引号,所以它变成:

iris[`<-`, blah, blah, ... ]

翻译成

`[`(iris, `<-`, blah, blah ,... )

但这是原语[ 不允许也永远不会允许的事情。

有些人建议您可以编写自己的方法,并且您可以 - 对于您自己定义的类。但是您不能重新定义 [ 本身以允许对任何通用数据框执行此操作,除非您重写 R 解释器以将您的构造识别为对 [&lt;- 而不是 [ 的调用。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多