Как проверить, определен ли объект (переменная) в R? - PullRequest
248 голосов
/ 21 февраля 2012

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

Мои попытки (безуспешно):

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

Спасибо!

Ответы [ 5 ]

393 голосов
/ 21 февраля 2012

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

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 
99 голосов
/ 21 февраля 2012

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

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
54 голосов
/ 10 марта 2013

если вы внутри функции, то пропущенный () - это то, что вам нужно.

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

exchequer()
x is missing… :-(
40 голосов
/ 24 сентября 2015

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

21 голосов
/ 17 апреля 2017

Если вы не хотите использовать кавычки, вы можете использовать трюк deparse (substitute ()), который я нашел в разделе примера? 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...