2013-07-16 2 views
11

Ich versuche eine R-Funktion zu schreiben, die einen Datensatz übernimmt und die Funktion plot() mit dem gelesenen Datensatz ausgibt Umgebung. Dies bedeutet, dass Sie nicht mehr attach() verwenden müssen, was eine gute Übung ist. Hier ist mein Beispiel:In R wird der folgende Fehler angezeigt: "Versuch, ein Objekt vom Typ 'closure' zu replizieren"

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 

Hier ist der Fehler Ich erhalte:

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

ich einige andere Versionen ausprobiert, aber sie alle geben mir den gleichen Fehler. Was mache ich falsch?

EDIT: Ich realisiere, dass der Code nicht zu praktisch ist. Mein Ziel ist es, funktionale Programmierung besser zu verstehen. Ich habe ein ähnliches Makro in SAS geschrieben, und ich habe gerade versucht, sein Gegenstück in R zu schreiben, aber ich versage. Ich habe das nur als Beispiel gewählt. Ich denke, es ist ein ziemlich einfaches Beispiel und doch funktioniert es nicht.

+0

Was Ihr Code versucht zu tun, zu unkonventionell. Können Sie sagen, was Sie erreichen wollen? – asb

Antwort

13

Es gibt ein paar kleine Probleme. ifelse ist eine vektorisierte Funktion, aber Sie brauchen nur eine einfache if. In der Tat brauchen Sie nicht wirklich eine else - Sie könnten einfach einen Fehler sofort werfen, wenn der Datensatz nicht existiert. Beachten Sie, dass Ihre Fehlermeldung den Name des Objekts nicht verwendet, so wird es seinen eigenen Fehler erstellen.

Sie übergeben a und b anstelle von "a" und "b". Anstelle der ds$x Syntax sollten Sie die ds[[x]] Syntax verwenden, wenn Sie programmieren (fortunes::fortune(312)). Wenn Sie die Funktion so aufrufen möchten, müssen Sie diese Argumente ebenfalls abwandeln. Schließlich glaube ich, Sie deparse(substitute()) wollen statt 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

Ich bin hier gelandet, nachdem ich "ifelse" benutzt habe, als ich 'if' hätte verwenden sollen - diese festen Dinge. –

Verwandte Themen