2013-07-16 24 views
11

Tôi đang cố gắng viết một hàm R lấy một tập dữ liệu và xuất ra hàm plot() với tập dữ liệu được đọc trong môi trường. Điều này có nghĩa là bạn không phải sử dụng attach() nữa, đó là thực hành tốt. Dưới đây là ví dụ của tôi:Trong R, nhận được lỗi sau: "cố gắng nhân rộng một đối tượng kiểu 'đóng'"

mydata <- data.frame(a = rnorm(100), b = rnorm(100,0,.2)) 
plot(mydata$a, mydata$b) # works just fine 

scatter_plot <- function(ds) { # function I'm trying to create 
    ifelse(exists(deparse(quote(ds))), 
     function(x,y) plot(ds$x, ds$y), 
      sprintf("The dataset %s does not exist.", ds)) 
    } 

scatter_plot(mydata)(a, b) # not working 

Đây là lỗi tôi nhận được:

Error in rep(yes, length.out = length(ans)) : 
    attempt to replicate an object of type 'closure' 

Tôi đã thử nhiều phiên bản khác, nhưng tất cả họ đều cho tôi những lỗi tương tự. Tôi đang làm gì sai?

EDIT: Tôi nhận ra mã không quá thực tế. Mục tiêu của tôi là hiểu lập trình chức năng tốt hơn. Tôi đã viết một macro tương tự trong SAS, và tôi đã cố gắng để viết đối tác của nó trong R, nhưng tôi thất bại. Tôi chỉ chọn đây là một ví dụ. Tôi nghĩ rằng đó là một ví dụ khá đơn giản nhưng nó không hoạt động.

+0

Mã của bạn đang cố gắng làm quá độc đáo. Bạn có thể nói những gì bạn đang buộc phải đạt được? – asb

Trả lời

13

Có một vài vấn đề nhỏ. ifelse là một hàm vectơ, nhưng bạn chỉ cần đơn giản if. Trong thực tế, bạn không thực sự cần một else - bạn chỉ có thể ném một lỗi ngay lập tức nếu tập dữ liệu không tồn tại. Lưu ý rằng thông báo lỗi của bạn không sử dụng tên của đối tượng, vì vậy nó sẽ tạo ra lỗi riêng của nó.

Bạn đang chuyển ab thay vì "a""b". Thay vì cú pháp ds$x, bạn nên sử dụng cú pháp ds[[x]] khi lập trình (fortunes::fortune(312)). Nếu đó là cách bạn muốn gọi hàm, thì bạn cũng sẽ phải loại bỏ các đối số đó. Cuối cùng, tôi nghĩ bạn muốn deparse(substitute()) thay vì deparse(quote())

scatter_plot <- function(ds) { 
    ds.name <- deparse(substitute(ds)) 
    if (!exists(ds.name)) 
    stop(sprintf("The dataset %s does not exist.", ds.name)) 
    function(x, y) { 
    x <- deparse(substitute(x)) 
    y <- deparse(substitute(y)) 
    plot(ds[[x]], ds[[y]]) 
    } 
} 
scatter_plot(mydata)(a, b) 
+2

Tôi đã kết thúc ở đây sau khi sử dụng 'ifelse' khi tôi nên sử dụng' if' - những thứ cố định đó. –

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