R:eval(parse(…)通常是次优的

R:eval(parse(…)通常是次优的,r,parsing,R,Parsing,所以,如果eval(parse(…)是次优的,那么另一种实现方法是什么呢 我正在使用RCurl从一个网站调用一些数据,在rjson包中使用fromJSON()后得到的是列表中的列表。列表的一部分包含订单号的名称,该名称将根据订单的不同而变化。列表如下所示: require('fortunes') fortune('106') Personally I have never regretted trying not to underestimate my own future stupidity.

所以,如果
eval(parse(…)
是次优的,那么另一种实现方法是什么呢

我正在使用RCurl从一个网站调用一些数据,在rjson包中使用
fromJSON()
后得到的是列表中的列表。列表的一部分包含订单号的名称,该名称将根据订单的不同而变化。列表如下所示:

require('fortunes')
fortune('106')
Personally I have never regretted trying not to underestimate my own future stupidity.
   -- Greg Snow (explaining why eval(parse(...)) is often suboptimal, answering a question triggered
      by the infamous fortune(106))
      R-help (January 2007)
我想提取
$orders$'5810584'$price

假设列表位于对象
dat
中。我使用
eval(parse(…)
来提取它的方法是:

$orders
$orders$'5810584'
$orders$'5810584'$quantity
[1] 10

$orders$'5810584'$price
[1] 15848

或_ID实际上,列表可能看起来有点不同。“$”约定有些误导。试试这个:

or_ID <- names(dat$orders) # get the order ID number
or_ID
"5810584"
sell_price <- eval(parse(text=paste('dat$',"orders$","'", or_ID, "'", "$price", sep="")))
sell_price
15848

“$”不计算其参数,但“[[”计算,因此
或_ID
将变为“5810584”。

不起作用,因为或_ID是字符而不是数字。使用,dat$orders[[1]]$price将使用
匹配
获得名称在
名称(dat$orders)中的位置
@Kev您可以使用字符参数为列表编制索引。我刚刚重新创建了您的列表,并尝试了我的建议,它成功了。如果它对您不起作用,那么您能否粘贴一个可复制的示例,以便我们可以实际使用您拥有的一些数据?这在功能上是否与@Dason的注释完全相同?尽管我理解您的观点:
[[
允许您概括为
dat[[foo\u ID][[or\u ID][[bar\u ID]]]
True。
x[[“a”]
x$a
。我试图强调这一点,“[”允许您混合评估级别:使用将被评估的引用值或符号。x$a形式主义具有误导性,因为它会导致新用户认为可能会对
a
进行评估,而情况正好相反。或
dat[[c(“订单”,或_ID,“价格”)]]
谢谢,@hadley。我有时会对“[[”真正能做什么感到困惑。出于某种原因,我很少成功地使用“[[”形式主义的多个参数。因此,显然我一直在将其应用于错误的问题。
dat[["orders"]][[ or_ID ]][["price"]]