Respostas:
Você quer exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Veja ?exists
, para alguma definição de "... está definido". Por exemplo
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
se você estiver dentro de uma função, falta () é o que você deseja.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
só funciona para argumentos de função, no entanto. Você não pode fazer foo <- function(x) {missing(x); missing(y)}
ou vai conseguir foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Como outros já apontaram, você está procurando exists
. Lembre-se de que o uso exists
com nomes usados pelos pacotes base de R retornará true, independentemente de você ter definido a variável:
> exists("data")
[1] TRUE
Para contornar isso (como apontado por Bazz; consulte ?exists
), use o inherits
argumento:
> exists("data", inherits = FALSE)
[1] FALSE
foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Obviamente, se você quisesse pesquisar os espaços de nomes dos pacotes anexados, isso também seria insuficiente:
> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
A única coisa que posso pensar para contornar isso - pesquisar nos pacotes anexados, mas não nos pacotes base - é o seguinte:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
Compare a substituição _object_name_
por "data.table"
( TRUE
) vs. "var"
( FALSE
)
(é claro, se você não está no RStudio, acho que o primeiro ambiente conectado automaticamente é "package:stats"
)
inherits = FALSE
parece isolar as coisas no ambiente global. Isso soa certo?
Se você não quiser usar aspas, use o deparse(substitute())
truque que encontrei na seção de exemplo de ?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
ou avaliá-lo na função da seguinte maneira:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Pode haver situações em que você não saiba exatamente o nome da variável que está procurando, como quando uma matriz de resultados foi criada por um sistema de enfileiramento. Eles podem ser endereçados com "ls" e seu argumento "padrão" que espera uma expressão regular.
A função "existe" pode ser reimplementada dessa maneira, como
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
Ao preparar esta resposta, fiquei um pouco surpreso com a necessidade da especificação do ambiente ao invocar ls () de dentro de uma função. Então, obrigado por isso, stackoverflow! Há também um atributo "all.names" que eu deveria ter definido como verdadeiro, mas omitido.