Відповіді:
Ви хочете 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, поверне справжнє значення незалежно від того, визначили ви змінну:
> 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", який я повинен був встановити на істинне, але пропустив.