2013-07-16 7 views
11

Próbuję napisać funkcję R, która pobiera zestaw danych i wyprowadza funkcję plot() z odczytanym zestawem danych środowisko. Oznacza to, że nie musisz już używać funkcji attach(), co jest dobrą praktyką. Oto mój przykład:W R, pojawia się następujący błąd: "próba replikacji obiektu typu" zamknięcie ""

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 

oto błąd Dostaję:

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

Próbowałem kilka innych wersji, ale wszystkie one dają mi ten sam błąd. Co ja robię źle?

EDYCJA: Rozumiem, że kod nie jest zbyt praktyczny. Moim celem jest lepsze zrozumienie programowania funkcjonalnego. Napisałem podobne makro w SAS i próbowałem napisać jego odpowiednik w R, ale zawodzę. Po prostu wybrałem to jako przykład. Myślę, że to całkiem prosty przykład, a mimo to nie działa.

+0

Jaki kod stara się zrobić zbyt niekonwencjonalny. Czy możesz powiedzieć, co chcesz osiągnąć? – asb

Odpowiedz

13

Jest kilka drobnych problemów. ifelse jest funkcją wektorową, ale wystarczy prosty if. W rzeczywistości naprawdę nie potrzebujesz else - możesz po prostu natychmiast zgłosić błąd, jeśli zestaw danych nie istnieje. Zauważ, że twój komunikat o błędzie nie używa nazwy obiektu, więc utworzy własny błąd.

Przejeżdżasz a i b zamiast "a" i "b". Zamiast składni ds$x należy użyć składni ds[[x]] podczas programowania (fortunes::fortune(312)). Jeśli w ten sposób chcesz wywołać tę funkcję, będziesz musiał także usunąć te argumenty. Wreszcie myślę chcesz deparse(substitute()) zamiast 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

Skończyłem tutaj po użyciu 'ifelse', kiedy powinienem był używać' if' - to naprawione rzeczy. –

Powiązane problemy