【问题标题】:Why are = and <- not equivalent in within()?为什么 = 和 <- 在 inside() 中不等价?
【发布时间】:2013-05-13 18:36:42
【问题描述】:
> within( list(a="a",b="b"), c="c" )
Error in eval(expr, envir, enclos) : argument is missing, with no default
> within( list(a="a",b="b"), c<-"c" )
$a
[1] "a"

$b
[1] "b"

$c
[1] "c"

我不确定为什么这两者不应该是等价的。由于...,似乎= 版本被解释为名为@9​​87654323@ 的参数。有什么办法可以禁用这种行为?我试过了,

within( list(a="a",b="b"), `c`="c" )

但这也失败了。

【问题讨论】:

  • system.time(x = rnorm(1e300)) 不起作用的原因相同。
  • 如果= 是传递给函数的表达式中的顶级函数调用,则= 被理解为参数赋值。与within( list(a="a",b="b"), {c="c"})比较
  • 这似乎也有效...within( list(a="a",b="b"), "="(c,"c") ),以防你真的讨厌&lt;- 分配。 :)
  • Frank 我喜欢无耻地利用 R 的操作符——实际上只是函数的概念。但我认为@MatthewPlourde 获胜是因为易于实施。 :-)
  • @MatthewPlourde 和 Frank,愿意为您的 cmets 提供答案吗?

标签: r


【解决方案1】:

c="c"(或该形式的任何子句)被解释为提供的参数是正确的。不,没有办法禁用它——它大概是在 R 解析器的级别处理的。

=&lt;- 之间的差异记录在 ?"&lt;-"

运算符“

“括号表达式列表”的主要示例是函数体,您可以通过键入来验证它,例如is(body(plot.default)), length(body(plot.default)).

【讨论】:

  • 感谢您的解释。每次我遇到这样的事情时,我想我会更多地了解 R 解析器的工作原理。现在,如果我有一个或两三个空闲的夏天可以涉足 C 源代码并弄清楚它是如何真正工作的 :-)
  • @AriB.Friedman -- 嘿,别引诱我自己去看看!我很高兴终于弄清楚对“支撑子表达式”的引用到底是什么意思,并且将其视为一种成就;)
  • 将@MatthewPlourde 的建议与您的建议相结合,is(quote({5^2}) 将返回[1] "{" "language",就像is(body(plot.default)) 一样。
【解决方案2】:

乔什已经回答了“为什么”,但在 OP 的建议下,这是另一个“如何”:

within( list(a="a",b="b"), "="(c,"c") )
# $a
# [1] "a"
#
# $b
# [1] "b"
#
# $c
# [1] "c"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2015-11-05
    • 2021-07-05
    • 2018-01-16
    相关资源
    最近更新 更多