我想知道为什么以下示例2不起作用(当然可能的解决方案:P)
test <- data.frame('a'=1:5,'b'=6:10)
#Example 1:
'$'(get('test'),'b')
#Example 2:
columnname = 'b'
'$'(get('test'),columnname)
答案 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期望索引是直接值或符号不需要评估,即不是变量