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

172

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

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

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

Спасибо!

Теги:

5 ответов

302
Лучший ответ

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

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 
  • 1
    @Gavin & Dirk, вы так добры друг к другу :) Единственное решение состоит в том, что вы подбрасываете монету (Бернулли с р = 0,5 :-)), который получит согласие! :-)
  • 25
    @tim, если вы внутри функции, отсутствует () - это то, что вы хотите.
Показать ещё 2 комментария
81

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

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
  • 7
    Вы выиграли на 52 секунды :)
  • 7
    @DirkEddelbuettel Хорошо, если вы будете использовать смехотворно длинные имена объектов ;-)
Показать ещё 1 комментарий
43

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

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

exchequer()
x is missing… :-(
  • 0
    missing только для аргументов функции. Вы не можете сделать foo <- function(x) {missing(x); missing(y)} или вы получите foo(1) > Error in missing(y) : 'missing' can only be used for arguments .
30

Как указывали другие, вы ищете 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")

  • 1
    Поигрывая, используя аргумент inherits = FALSE кажется, изолирует вещи в глобальной среде. Это звучит правильно?
  • 0
    @ Базз, ты прав; Я отредактировал это в ответ.
Показать ещё 1 комментарий
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
  • 0
    Я бы хотел, чтобы люди знали, как это плохо. Хорошая работа.
  • 0
    Вы также можете force или оценить его в функции следующим образом: is.defined <- function(sym) class(try(sym, TRUE))!='try-error'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню