2012-06-13 38 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) 

Vì vậy nếu eval(parse(...)) là tối ưu hóa một cách khác để thực hiện điều này là gì?R: eval (phân tích (...)) thường thấp hơn số tối thiểu

Tôi đang gọi một số dữ liệu từ trang web sử dụng RCurl, những gì tôi nhận được sau khi sử dụng fromJSON() trong gói rjson là danh sách trong danh sách. Một phần của danh sách có tên của một số thứ tự sẽ thay đổi tùy thuộc vào thứ tự. Danh sách này trông giống như sau:

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

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

tôi muốn trích xuất các giá trị trong $orders$'5810584'$price

Giả sử danh sách là trong đối tượng dat. Những gì tôi đã làm để trích xuất điều này bằng cách sử dụng eval(parse(...)) là:

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 

Điều gì sẽ là cách tối ưu hơn để làm điều này?

+5

dat $ orders [[or_ID]] $ price? – Dason

+0

không hoạt động vì or_ID là ký tự chứ không phải là số. Sử dụng, dat $ orders [[1]] $ price sẽ hoạt động – Kevin

+0

Sử dụng 'match' để lấy vị trí của tên trong' tên (dat $ orders) '. – joran

Trả lời

19

Thực ra danh sách có thể hơi khác một chút. Quy ước '$' có phần gây hiểu nhầm. Hãy thử điều này:

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

'$' không đánh giá đối số của nó, nhưng "[[" không, do đó 'or_ID' sẽ được chuyển thành "5810584".

+0

Chức năng này có giống hệt với nhận xét của @Dason không? Tho 'Tôi hiểu điểm của bạn: '[[' cho phép bạn khái quát hóa 'dat [[foo_ID]] [[hoặc_ID]] [[bar_ID]]' –

+0

Đúng. 'x [[" a "]]' là 'x $ a'. Tôi đã cố gắng nhấn mạnh điểm đó rằng "[[" cho phép bạn trộn các mức đánh giá: sử dụng các giá trị được trích dẫn hoặc các ký hiệu sẽ được đánh giá. Các x $ một hình thức là gây hiểu lầm trong đó nó dẫn người dùng mới để nghĩ rằng có thể có đánh giá của 'a', khi đối diện là trường hợp. –

+3

Hoặc 'dat [[c (" đơn đặt hàng ", hoặc_ID," giá ")]]' – hadley

Các vấn đề liên quan