通过R中的变量引用列名

时间:2013-10-10 20:09:21

标签: r

我想知道为什么以下示例2不起作用(当然可能的解决方案:P)

test <- data.frame('a'=1:5,'b'=6:10)
#Example 1:
'$'(get('test'),'b')

#Example 2:
columnname = 'b'
'$'(get('test'),columnname)

2 个答案:

答案 0 :(得分:3)

因为$没有评估其第二个论点。 (我认为这个事实已在帮助页面中明确说明,但在审核之后,我不太确定我能否提出这一说法。)帮助页面中的相关句子是:

The main difference is that $ does not allow computed indices, whereas [[ does.

正如iTech建议的那样,[[$之间的一个重要区别是$需要一个字符向量作为其第二个参数,而[[能够接受一个字符矢量或要评估的对象名称。 (另一个区别是$只接受第一个参数的递归对象。)

在搜索之前的时间这个问题已得到解决时,我发现了另一个解决方案,它只能用于学习语言,而不能用于编码策略:

columnname = 'b'
do.call(  '$', list(get('test'), columnname))
[1]  6  7  8  9 10

这确实提供了另一种机制来评估第二个参数以及第一个参数,但它看起来像折磨代码给我。您应该在列表中收集要处理的项目,并使用{[1}}或lapply使用“[[”或“[”作为sapply的相应参数)来运行这些项目。

答案 1 :(得分:1)

只需将$更改为[[

即可

以下是一个例子:

'[['(get('test'),columnname)

这个想法是使用$ R期望索引是直接值或符号需要评估,即不是变量