Ich möchte überprüfen, ob eine Variable in R definiert ist - ohne einen Fehler zu erhalten. Wie kann ich das machen?
Meine Versuche (nicht erfolgreich):
> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found
Vielen Dank!
Siehe
?exists
für eine Definition von "... ist definiert". Z.Bquelle
Wenn Sie sich in einer Funktion befinden, möchten Sie (() nicht ().
quelle
missing
funktioniert jedoch nur für Funktionsargumente. Sie können nicht tunfoo <- function(x) {missing(x); missing(y)}
oder Sie werden bekommenfoo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.Wie andere betont haben, suchen Sie
exists
. Beachten Sie, dass die Verwendungexists
mit Namen, die von Rs Basispaketen verwendet werden, true zurückgibt, unabhängig davon, ob Sie die Variable definiert haben:?exists
Verwenden Sie das folgendeinherits
Argument , um dies zu umgehen (wie von Bazz hervorgehoben; siehe ).Wenn Sie die Namensräume angehängter Pakete durchsuchen möchten, ist dies natürlich auch nicht ausreichend:
Das einzige, was ich mir vorstellen kann, um dies zu umgehen - in angehängten Paketen zu suchen, aber nicht in Basispaketen - ist das Folgende:
Vergleiche Ersetzen
_object_name_
mit"data.table"
(TRUE
) vs."var"
(FALSE
)(Wenn Sie nicht auf RStudio sind, ist die erste automatisch angehängte Umgebung natürlich
"package:stats"
)quelle
inherits = FALSE
scheint die Dinge in der globalen Umgebung zu isolieren. Klingt das richtig?Wenn Sie keine Anführungszeichen verwenden möchten, können Sie einen
deparse(substitute())
Trick verwenden, den ich im Beispielabschnitt von?substitute
:quelle
force
oder in der Funktion wieis.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Es kann Situationen geben, in denen Sie den Namen der gesuchten Variablen nicht genau kennen, z. B. wenn ein Warteschlangensystem eine Reihe von Ergebnissen erstellt hat. Diese können möglicherweise mit "ls" und seinem Argument "pattern" angesprochen werden, das einen regulären Ausdruck erwartet.
Die Funktion "existiert" könnte auf diese Weise wie folgt neu implementiert werden
Während ich diese Antwort vorbereitete, war ich ein wenig überrascht über die Notwendigkeit, die Spezifikation der Umgebung zu benötigen, wenn ls () innerhalb einer Funktion aufgerufen wird . Also, danke dafür, Stackoverflow! Es gibt auch ein "all.names" -Attribut, das ich auf true hätte setzen sollen, aber weggelassen habe.
quelle