Как проверить, определен ли объект (переменная) в R?

Я хотел бы проверить, определена ли какая-либо переменная в R - без получения ошибки. Как я могу это сделать?

Мои попытки (не удачные):

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

Спасибо!

Ответ 1

Вы хотите exists():

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

Ответ 2

См. ?exists, для некоторого определения "... определено". Например.

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

Ответ 3

если вы находитесь внутри функции, missing() - это то, что вы хотите.

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

exchequer()
x is missing… :-(

Ответ 4

Как указывали другие, вы ищете exists. Имейте в виду, что использование exists с именами, используемыми базовыми пакетами R, вернет true независимо от того, была ли определена переменная:

> exists("data")
[1] TRUE

Чтобы обойти это (как указано Bazz, см. ?exists), используйте аргумент inherits:

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

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

Конечно, если вы хотите искать пространства имен прикрепленных пакетов, это также не оправдывает:

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

Единственное, что я могу подумать обойти это - искать в прикрепленных пакетах, но не в базовых пакетах, - это следующее:

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

Сравните замену _object_name_ на "data.table" (TRUE) и "var" (FALSE)

(конечно, если вы не на RStudio, я думаю, что первая автоматически подключенная среда "package:stats")

Ответ 5

Если вы не хотите использовать кавычки, вы можете использовать трюк deparse (substitute()), который я нашел в разделе примера? replace:

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

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

Ответ 6

Могут быть ситуации, когда вы точно не знаете имя переменной, которую вы ищете, например, когда массив результатов был создан системой массового обслуживания. Возможно, к ним можно обратиться с помощью "ls" и его аргумента "pattern", который ожидает регулярное выражение.

Функция "Существует" может быть переопределена таким образом, как

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

При подготовке этого ответа я был немного удивлен необходимостью спецификации среды при вызове ls() из функции. Итак, спасибо вам за это, stackoverflow! Есть также атрибут "all.names", который я должен был установить в true, но пропустить.