Ответы:
Вы хотите exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Смотрите ?exists
, для некоторого определения "... определяется". Например
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
если вы находитесь внутри функции, то вы пропускаете ().
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
однако работает только для аргументов функции. Вы не можете сделать, foo <- function(x) {missing(x); missing(y)}
или вы получите foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Как уже отмечали другие, вы ищете 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"
)
inherits = FALSE
кажется, изолирует вещи в глобальной среде. Это звучит правильно?
Если вы не хотите использовать кавычки, вы можете использовать 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
force
или оценить это в функции, как это:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Могут быть ситуации, в которых вы точно не знаете имя переменной, которую вы ищете, например, когда массив результатов был создан системой массового обслуживания. Возможно, к ним можно обратиться с помощью «ls» и его аргумента «pattern», который ожидает регулярное выражение.
Функция «существует» может быть переопределена таким образом, как
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
При подготовке этого ответа я был немного удивлен необходимостью спецификации среды при вызове ls () из функции. Итак, спасибо вам за это, stackoverflow! Есть также атрибут "all.names", который я должен был установить в true, но пропустить.