2013-08-16 23 views
12

Tôi gặp lỗi khi thử và kết hợp sử dụng expression với do.callplot.Cách kết hợp do.call() plot() và expression()

x <- 1:10 
y <- x^1.5 

Tôi có thể lấy cốt truyện tôi muốn bằng cách chỉ sử dụng các chức năng plot:

plot(y~x,xlab=expression(paste("Concentration (",mu,"M)"))) 

Tuy nhiên, tôi muốn thực hiện âm mưu của tôi sử dụng do.call. Tôi có một danh sách các thông số thực sự được lưu trữ dưới dạng danh sách, p. Tuy nhiên, khi tôi cố gắng và vượt qua danh sách để do.call tôi nhận được lỗi sau:

p <- list(xlab=expression(paste("Concentration (",mu,"M)"))) 
do.call(plot,c(y~x,p)) 
Error in paste("Concentration (", mu, "M)") : 
    object 'mu' not found 

Tôi cũng đã cố gắng xác định công thức một cách rõ ràng trong args truyền cho do.call. I E. do.call(plot,c(formula=y~x,p)). Tôi không hiểu tại sao tôi gặp lỗi - đặc biệt là vì các lỗi sau không đưa ra lỗi:

do.call(plot,c(0,p)) 

(và cung cấp ký tự mu mong muốn trong xaxis).

+0

+1 cho quan sát thú vị của bạn về hành vi của 'do.call (cốt truyện, c (0, p))'. –

+0

có thể trùng lặp của [plot() và do.call(): Làm cách nào để chuyển biểu thức cho tiêu đề cốt truyện khi '...' được sử dụng khác?] (Http://stackoverflow.com/questions/13982856/plot-and- do-call-how-to-pass-expression-to-plot-title-khi-is-used-o) – Metrics

+0

@Metrics Tôi đã đọc câu hỏi đó trước khi đăng. – dayne

Trả lời

12

do.call đánh giá các thông số trước khi chạy chức năng; hãy thử gói biểu thức trong quote:

p <- list(xlab=quote(expression(paste("Concentration (",mu,"M)")))) 
do.call("plot", c(y~x, p)) 
+1

Cảm ơn! Bạn có biết tại sao 'do.call (cốt truyện, c (0, p))' không đưa ra lỗi? – dayne

+1

Thú vị tìm thấy! Có vẻ như tôi đoán tại sao nó không hoạt động không hoàn toàn chính xác. Một người đang sử dụng 'graphics ::: plot.default' và cái kia đang sử dụng' graphics ::: plot.formula'. Tôi thấy rằng 'graphics ::: plot.formula' đang làm một số công cụ funky với tham số' xlab' bằng cách sử dụng 'enquote'; Tôi phải nhìn kỹ hơn để hiểu tại sao điều đó lại khiến nó thất bại. – Aaron

+2

Cả hai bạn nên ngừng sử dụng các đối số 'sep' trong plotmath-'paste'. Tốt nhất là họ bị phớt lờ, và tệ nhất là họ được đặt vào cuối biểu thức và không phải nơi bạn muốn họ. –

13

Bạn có thể sử dụng alist thay vì sau đó list

p <- alist(xlab=expression(paste("Concentration (",mu,"M)"))) 
do.call(plot,c(y~x,p)) 
+1

(+1) Thay thế tốt. – dayne

7

Đặt quote=TRUE cũng hoạt động. Nó có hiệu lực ngăn chặn do.call() từ việc đánh giá các yếu tố của args trước khi nó chuyển chúng đến hàm được đưa ra bởi what.

x <- 1:10 
y <- x^1.5 
p <- list(xlab=expression(paste("Concentration (",mu,"M)",sep=""))) 

do.call(what = "plot", args = c(y ~ x, p), quote = TRUE)