365 Stimmen

Wie kann man prüfen, ob ein Objekt (eine Variable) in R definiert ist?

Ich möchte überprüfen, ob eine Variable in R definiert ist - ohne einen Fehler zu erhalten. Wie kann ich das tun?

Meine Versuche (nicht erfolgreich):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

Danke!

552voto

Dirk Eddelbuettel Punkte 345316

Sie wollen exists() :

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>

132voto

Gavin Simpson Punkte 163780

Siehe ?exists für eine Definition von "...ist definiert". Z.B..

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE

70voto

tim Punkte 3264

Wenn Sie sich innerhalb einer Funktion befinden, ist missing() das, was Sie wollen.

exchequer = function(x) {
    if(missing(x)){
        message("x is missing… :-(")
    }
}

exchequer()
x is missing… :-(

62voto

sbaldrich Punkte 1022

Wie andere bereits erwähnt haben, suchen Sie nach exists . Beachten Sie, dass die Verwendung von exists mit Namen, die von den Basispaketen von R verwendet werden, würde true zurückgeben, unabhängig davon, ob Sie die Variable definiert haben:

> exists("data")
[1] TRUE

Um dies zu umgehen (wie von Bazz aufgezeigt; siehe ?exists ), verwenden Sie die inherits Argument:

> exists("data", inherits = FALSE)
[1] FALSE

foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE

Wenn Sie die Namensräume der angehängten Pakete durchsuchen wollten, würde dies natürlich auch nicht funktionieren:

> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE

Das Einzige, was mir einfällt, um dies zu umgehen, ist die Suche in angehängten Paketen, aber nicht in Basispaketen - ist die folgende:

any(sapply(1:(which(search() == "tools:rstudio") - 1L),
           function(pp) exists(_object_name_, where = pp, inherits = FALSE)))

Vergleiche Ersetzen _object_name_ mit "data.table" ( TRUE ) gegen. "var" ( FALSE )

(natürlich, wenn Sie nicht mit RStudio arbeiten, denke ich, dass die erste automatisch angeschlossene Umgebung ist "package:stats" )

40voto

Nirmal Punkte 607

Wenn Sie keine Anführungszeichen verwenden möchten, können Sie auch deparse(substitute()) Trick, den ich in dem Beispielabschnitt von ?substitute :

is.defined <- function(sym) {
  sym <- deparse(substitute(sym))
  env <- parent.frame()
  exists(sym, env)
}

is.defined(a)
# FALSE
a <- 10
is.defined(a)
# TRUE

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X