2013-07-16 5 views
11

Sto provando a scrivere una funzione R che prende un set di dati e restituisce la funzione plot() con il set di dati letto nel suo ambiente. Ciò significa che non devi più usare attach(), che è una buona pratica. Ecco il mio esempio:In R, ottenendo il seguente errore: "tentativo di replicare un oggetto di tipo 'chiusura'"

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 

Ecco l'errore che sto ricevendo:

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

Ho provato diverse altre versioni, ma tutti mi danno lo stesso errore. Che cosa sto facendo di sbagliato?

EDIT: Mi rendo conto che il codice non è troppo pratico. Il mio obiettivo è quello di capire meglio la programmazione funzionale. Ho scritto una macro simile in SAS, e stavo solo cercando di scrivere la sua controparte in R, ma sto fallendo. Ho appena scelto questo come esempio. Penso che sia un esempio piuttosto semplice e tuttavia non funziona.

+0

Che il codice sta cercando di fare è troppo convenzionale. Puoi dire cosa stai cercando di raggiungere? – asb

risposta

13

Ci sono alcuni piccoli problemi. ifelse è una funzione vettoriale, ma è sufficiente un semplice if. In realtà, non hai davvero bisogno di un else - potresti semplicemente lanciare un errore immediatamente se il set di dati non esiste. Nota che il tuo messaggio di errore non sta usando il nome dell'oggetto, quindi creerà il proprio errore.

Si sta passando a e b anziché "a" e "b". Invece della sintassi ds$x, è necessario utilizzare la sintassi ds[[x]] durante la programmazione (fortunes::fortune(312)). Se questo è il modo in cui si desidera chiamare la funzione, allora sarà necessario ridistribuire tali argomenti. Infine, penso che si desidera deparse(substitute()) invece di 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

Ho finito qui dopo aver usato 'ifelse' quando avrei dovuto usare' if' - quelle cose fisse. –