Risposte:
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 () è quello che vuoi.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
funziona solo per argomenti di funzione, tuttavia. Non puoi fare foo <- function(x) {missing(x); missing(y)}
o otterrai foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Come altri hanno sottolineato, stai cercando exists
. Tieni presente che l'utilizzo exists
con i nomi utilizzati dai pacchetti di base di R restituisce true indipendentemente dal fatto che tu abbia definito la variabile:
> exists("data")
[1] TRUE
Per aggirare questo (come sottolineato da Bazz; vedi ?exists
), usa l' inherits
argomento:
> exists("data", inherits = FALSE)
[1] FALSE
foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Naturalmente, se si desidera cercare gli spazi dei nomi dei pacchetti allegati, anche questo non sarebbe:
> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
L'unica cosa che mi viene in mente per aggirare questo problema - per cercare nei pacchetti allegati ma non nei pacchetti di base - è la seguente:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
Confronta sostituendo _object_name_
con "data.table"
( TRUE
) vs. "var"
( FALSE
)
(ovviamente, se non sei su RStudio, penso che il primo ambiente collegato automaticamente sia "package:stats"
)
inherits = FALSE
sembra isolare le cose nell'ambiente globale. Suona bene?
Se non vuoi usare le virgolette, puoi usare il deparse(substitute())
trucco che ho trovato nella sezione di esempio di ?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
force
o valutarlo nella funzione in questo modo:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Potrebbero verificarsi situazioni in cui non si conosce esattamente il nome della variabile che si sta cercando, ad esempio quando un array di risultati è stato creato da un sistema di accodamento. Questi possono eventualmente essere affrontati con "ls" e il suo argomento "pattern" che prevede un'espressione regolare.
La funzione "esiste" potrebbe essere reimplementata in questo modo come
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
Durante la preparazione di questa risposta, sono rimasto un po 'sorpreso dalla necessità di specificare l'ambiente quando invoco ls () dall'interno di una funzione. Quindi, grazie per quello, StackOverflow! C'è anche un attributo "all.names" che avrei dovuto impostare su true ma ho omesso.