2013-07-16 13 views
11

Bir veri kümesi alan bir R işlevi yazmaya çalışıyorum ve plot() işlevini, içindeki veri kümesinde okuyarak çıktıyorum. ortamı. Bu, attach() öğesini artık kullanmak zorunda olmadığınız anlamına gelir, bu iyi bir uygulamadır.R, aşağıdaki hatayı alıyorum: "'kapatma' türünde bir nesneyi çoğaltma girişiminde bulunma"

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 

İşte alıyorum hata var: İşte benim örnek

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

Birkaç diğer versiyonlarını denedim, ama hepsi bana aynı hatayı verir. Neyi yanlış yapıyorum? EDIT: Kodun çok pratik olmadığını anlıyorum. Amacım, işlevsel programlamayı daha iyi anlamak. SAS'ta benzer bir makro yazdım, ve onun muadilini R'ye yazmaya çalışıyordum, ama başarısız oluyorum. Bunu bir örnek olarak seçtim. Bence oldukça basit bir örnek ve işe yaramıyor.

+0

deparse(substitute()) yerine deparse(quote()) istiyorum ne kodunuzu yapmaya çalışıyor çok sıradışı olduğunu düşünüyorum. Neyi başarmak için söylediğinizi söyleyebilir misin? – asb

cevap

13

Birkaç küçük sorun var. ifelse vektörel bir işlevdir, ancak basit bir if'a ihtiyacınız vardır. Aslında, gerçekten bir else'a ihtiyacınız yoktur - veri kümesi yoksa hemen bir hata atabilirsiniz. Hata iletinizin, nesnenin adını kullanmadığını unutmayın, bu nedenle kendi hatasını oluşturur.

"a" ve "b" yerine a ve b iletiliyorsunuz. ds$x sözdizimi yerine, programlama yaparken ds[[x]] sözdizimini kullanmalısınız (fortunes::fortune(312)). Eğer bu işlevi çağırmak istediğiniz yol buysa, o zaman bu argümanları da ayırmanız gerekecektir. Son olarak, sana

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

Burada "if" i kullanmam gerektiğinde 'ifelse' kullanıldıktan sonra buraya girdim. –