2014-02-05 4 views
7

In R, wenn ich versuche, eine Funktion über ifelse zuweisen, ich die folgende Fehlermeldung erhalten:Warum kann ich eine Funktion nicht mit ifelse in R zuweisen?

> my.func <- ifelse(cond, sqrt, identity) 
Error in rep(yes, length.out = length(ans)) : 
    attempt to replicate an object of type 'builtin' 

Wenn condFALSE ist, sieht die Fehler Äquivalent, klagt R über eine

attempt to replicate an object of type 'closure' 

Was kann ich tun, um einer Variablen eine von zwei Funktionen zuzuordnen und was passiert hier?

+0

Diese Frage wurde inspiriert und bezieht sich auf [diese Frage] (http://stackoverflow.com/questions/17685502). – quazgar

Antwort

5

Da ifelse vektorisiert ist und keine Sonderfälle für nicht vektorisierte Bedingungen bereitstellt, werden die Argumente mit rep(...) repliziert. rep(...) schlägt für Verschlüsse wie im Beispiel jedoch fehl.

Eine Abhilfe wäre temprarily die Funktionen wickeln:

my.func <- ifelse(cond, c(sqrt), c(identity))[[1]] 
+1

Ich würde mit 'switch' gehen - es gibt Beispiele in vielen Tutorials, wie man 'switch' verwendet, um verschiedene Funktionen zu greifen und sie auf die Eingabe anzuwenden. –

+9

... oder einfach 'my.func <- if (cond) sqrt else identity'. Keine Notwendigkeit, 'ifelse' zu ​​missbrauchen. –

1

@Joshua Ulrich Kommentar ist eine richtige Antwort. Der richtige Weg bedingte Funktionszuordnung zu erreichen, ist ein klassisches if...else eher als die vektorisiert ifelse Methode:

my.func <- if (cond) sqrt else identity 
Verwandte Themen