-1

我想知道为什么下面的示例 2 不起作用(当然还有潜在的解决方案:P)

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

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

2 回答 2

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

这确实提供了另一种评估第二个参数和第一个参数的机制,但对我来说它看起来像是受折磨的代码。您应该收集要在列表中处理的项目,并使用lapplysapply使用“[[”或“[”作为FUN.

于 2013-10-10T20:51:24.590 回答
1

只需更改$[[

这是一个例子:

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

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

于 2013-10-10T20:21:31.307 回答