2012-06-13 2 views
8
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) 

따라서 eval(parse(...))이 차선책 인 경우이를 수행하는 다른 방법은 무엇입니까?R : eval (구문 분석 (...))은 종종 최적 이하입니다.

나는 RCurl을 사용하여 웹 사이트에서 데이터를 호출하고 있는데, rjson 패키지에 fromJSON()을 사용하면 얻을 수있는 것이 목록 내의 목록입니다. 목록의 일부에는 주문에 따라 변경되는 주문 번호의 이름이 있습니다. 나는 목록 객체 dat에 말

$orders$'5810584'$price의 값을 추출 할

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

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

: 목록은 뭔가 것 같습니다. 내가 추출하기 위해 무슨 짓을 사용하여이 eval(parse(...))이었다

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 

무엇이 일을 더 최적의 방법이 될 것이다?

+5

dat $ orders [[or_ID]] $ price? or_ID가 숫자가 아니기 때문에 – Dason

+0

이 작동하지 않습니다. dat $ orders [[1]] $ price가 작동합니다. – Kevin

+0

'name (dat $ orders)'에서 이름의 위치를 ​​얻기 위해'match'를 사용하십시오. – joran

답변

19

실제로 목록은 조금 다르게 보입니다. '$'협약은 오해의 소지가 있습니다.

dat[["orders"]][[ or_ID ]][["price"]] 

'$'인수를 평가하지 않지만, "[["않기 때문에 'or_ID' "5810584"로 바뀌 얻을 것이다 :이보십시오.

+0

이 기능적으로 @Dason의 코멘트와 일치하지 않습니까? Tho '나는 당신의 요지를 이해한다 :'[[''[[foo_ID]] [[or_ID]] [[bar_ID]]' –

+0

True로 일반화시킬 수있다. 'x [[ "a"]]'는'x $ a'입니다. 나는 강조점을 강조하려고 노력했다. "[["는 평가의 수준을 혼합 할 수 있습니다 : 평가 된 값이나 기호를 사용하여 평가를받습니다. x $ a 형식주의는 새로운 사용자가 'a'에 대한 평가가 있다고 생각하게하는 데있어 오도 된 것입니다. 반대의 경우입니다. –

+3

또는'dat [[c ("orders", or_ID, "price")]] ' – hadley