Dans R, vous obtenez l'erreur suivante: "tentative de réplication d'un objet de type" fermeture ""
Je suis en train d'écrire une fonction R qui prend un ensemble de données et les sorties de l'intrigue() fonction avec l'ensemble de données à lire dans son environnement. Cela signifie que vous n'avez pas à utiliser attach() plus, ce qui est une bonne pratique. Voici mon exemple:
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
Voici l'erreur que je reçois:
Error in rep(yes, length.out = length(ans)) :
attempt to replicate an object of type 'closure'
J'ai essayé plusieurs autres versions, mais ils ont tous de me donner la même erreur. Ce que je fais mal?
EDIT: je me rends compte que le code n'est pas trop pratique. Mon but est de comprendre la programmation fonctionnelle mieux. J'ai écrit une macro similaire dans le SAS, et j'essayais juste d'écrire son homologue dans R, mais je ne suis pas. J'ai juste pris cela comme un exemple. Je pense que c'est un exemple assez simple et pourtant ça ne fonctionne pas.
source d'informationauteur mahin | 2013-07-16
Vous devez vous connecter pour publier un commentaire.
Il y a quelques petits problèmes.
ifelse
est un vectorisé fonction, mais vous avez juste besoin d'un simpleif
. En fait, vous n'avez pas vraiment besoin d'unelse
-- vous pouvez simplement les jeter immédiatement une erreur si l'ensemble de données n'existe pas. Notez que votre message d'erreur n'est pas en utilisant le nom de l'objet, de sorte qu'il va créer sa propre erreur.Vous êtes de passage à
a
etb
au lieu de"a"
et"b"
. Au lieu de lads$x
syntaxe, vous devez utiliser leds[[x]]
de syntaxe lors de la programmation (fortunes::fortune(312)
). Si c'est la façon dont vous voulez l'appeler la fonction, alors vous aurez à deparse ces arguments. Enfin, je pense que vous voulezdeparse(substitute())
au lieu dedeparse(quote())