3

我对何时将值视为变量以及何时将值视为 R 中的字符串感到困惑。在 Ruby 和 Python 中,我习惯于始终必须引用的字符串,而未引用的字符串始终被视为变量. IE。

a["hello"] => a["hello"]
b = "hi"
a[b] => a["hi"]

但在 R 中,情况并非如此,例如

a$b < c(1,2,3)

b 这里是列的值/名称,而不是变量 b。

c <- "b"
a$c => column not found (it's looking for column c, not b, which is the value of the variable c)

(我知道在这种特定情况下我可以使用 a[c],但还有很多其他情况。例如ggplot(a, aes(x=c))- 我想绘制作为 c 值的列,而不是名称 c)...

在其他 StackOverflow 问题中,我看到了引用、替代等内容。

我的问题是:是否有一种“扩展”变量并确保使用变量的值而不是变量名的通用方法?或者这不是R中的事情吗?

4

5 回答 5

3

在您的示例中,a$ba[["b"]]. $当与列表一起使用时,这是符号的一个特殊功能。第二种形式符合您的预期 -a[[b]]将返回a名称 ==变量 b的值的元素,而不是名称“b”的元素。

数据框类似。对于数据框a$运算符指的是列名。所以a$b是一样的a[ , "b"]。在这种情况下,要引用的a指示的列,请使用。ba[, b]

于 2013-05-10T15:50:44.543 回答
3

您发布的有关$操作员的内容不起作用的原因非常微妙,并且通常与 R 中的大多数其他情况完全不同,在这些情况下您可以使用get为该目的设计的类似函数。但是,调用a$b相当于调用

`$`(a , b)

这提醒我们,在 R 中,一切都是对象。$是一个函数,它有两个参数。如果我们检查源代码,我们可以看到调用a$c并期望 R 计算c永远"b"不会起作用,因为在源代码中它声明:

/* The $ subset operator.  
   We need to be sure to only evaluate the first argument.  
   The second will be a symbol that needs to be matched, not evaluated.  
*/

它使用以下方法实现了这一点:

if(isSymbol(nlist) )
SET_STRING_ELT(input, 0, PRINTNAME(nlist));
else if(isString(nlist) )
SET_STRING_ELT(input, 0, STRING_ELT(nlist, 0));
else {
errorcall(call,_("invalid subscript type '%s'"),
      type2char(TYPEOF(nlist)));
}

nlist是您传递的参数do_subset_3(C 函数的名称$映射到),在本例中为c. 它发现那c是一个符号,所以它用一个字符串替换它,但不评估它。如果它是一个字符串,那么它作为一个字符串传递。

于 2013-05-10T15:54:52.737 回答
2

这里有一些链接可以帮助您了解 R 中评估的“为什么”和“何时”。它们可能很有启发性,甚至可能会有所帮助,如果不出意外,它们会让您知道您并不孤单:

http://developer.r-project.org/nonstandard-eval.pdf

http://journal.r-project.org/2009-1/RJournal_2009-1_Chambers.pdf

http://www.burns-stat.com/documents/presentations/inferno-ish-r/

在最后一个中,最重要的部分是要点 2,然后通读整套幻灯片。我可能会从第 3 个开始,然后是第 1 个 2。

这些不是如何使特定案例工作的精神(正如其他答案所做的那样),而更多的是导致这种事态的精神以及为什么在某些情况下使用标准的非标准方法是有意义的访问变量。希望了解原因和时间将有助于整体做什么。

于 2013-05-10T19:58:29.057 回答
0

如果要获取名为“b”的变量,请在每种情况下使用 get 函数。这将用 b 的值替换 get(b) 的任何位置。

于 2013-05-10T15:41:47.293 回答
0

如果你想玩转表达式,你需要使用 quote()、substitute()、bquote() 和你提到的朋友。

例如:

x <- quote(list(a = 1))
names(x) # [1] ""  "a"
names(x) <- c("", a)
x # list(foo = 1)

和:

c <- "foo"
bquote(ggplot(a, aes(x=.(c)))) # ggplot(a, aes(x = "foo"))
substitute(ggplot(a, aes(x=c)), list(c = "foo"))
于 2013-05-10T15:48:39.517 回答