我想知道为什么下面的示例 2 不起作用(当然还有潜在的解决方案:P)
test <- data.frame('a'=1:5,'b'=6:10)
#Example 1:
'$'(get('test'),'b')
#Example 2:
columnname = 'b'
'$'(get('test'),columnname)
我想知道为什么下面的示例 2 不起作用(当然还有潜在的解决方案:P)
test <- data.frame('a'=1:5,'b'=6:10)
#Example 1:
'$'(get('test'),'b')
#Example 2:
columnname = 'b'
'$'(get('test'),columnname)
因为$
不评估它的第二个论点。(我认为帮助页面中明确说明了这一事实,但在查看之后,我不确定我是否可以提出该声明。)帮助页面中的相关句子是:
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
这确实提供了另一种评估第二个参数和第一个参数的机制,但对我来说它看起来像是受折磨的代码。您应该收集要在列表中处理的项目,并使用lapply
或sapply
使用“[[”或“[”作为FUN
.
只需更改$
为[[
这是一个例子:
'[['(get('test'),columnname)
这个想法是通过使用$
R 期望索引是直接值或不需要评估的符号,即不是变量