Come verificare se object (variabile) è definito in R?

Vorrei verificare se alcune variabili sono definite in R – senza ottenere un errore. Come posso fare questo?

I miei tentativi (non riusciti):

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

Grazie!

Vuoi exists() :

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

Vedi ?exists , per alcune definizioni di “… è definito”. Per esempio

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

se sei all’interno di una funzione, missing () è ciò che desideri.

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

Come altri hanno sottolineato, stai cercando exists . Tieni presente che l’utilizzo dei nomi con i nomi usati dai pacchetti base di R restituisce true indipendentemente dal fatto che tu abbia definito la variabile:

 > exists("data") [1] TRUE 

Per aggirare questo problema (come indicato da Bazz, vedere ?exists ), utilizzare l’argomento inherits :

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

Ovviamente, se si desidera cercare gli spazi dei nomi dei pacchetti allegati, anche questo non sarebbe sufficiente:

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

L’unica cosa che posso pensare per aggirare questo – per cercare nei pacchetti allegati ma non nei pacchetti base – è la seguente:

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

Confrontare la sostituzione di _object_name_ con "data.table" ( TRUE ) con "var" ( FALSE )

(ovviamente, se non si è su RStudio, penso che il primo ambiente collegato automaticamente sia "package:stats" )

Se non vuoi usare le virgolette, puoi usare il trucco deparse (sostituto ()) che ho trovato nella sezione di esempio di “sostituto:

 is.defined <- function(sym) { sym <- deparse(substitute(sym)) env <- parent.frame() exists(sym, env) } is.defined(a) # FALSE a <- 10 is.defined(a) # TRUE