Yanıtlar:
İstediğiniz exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
?exists
"... Tanımlandı" nın bazı tanımları için bakınız . Örneğin
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
bir işlevin içindeyseniz, eksik () istediğiniz şeydir.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
ancak yalnızca işlev bağımsız değişkenleri için kullanılabilir. Yapamazsın foo <- function(x) {missing(x); missing(y)}
ya da alacaksın foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Diğerlerinin işaret ettiği gibi, siz arıyoruz exists
. Kullanarak unutmayın exists
R'ın baz paketleri tarafından kullanılan adlarla bakılmaksızın tanımlı değişkenlere da geçerlidir döndürür:
> exists("data")
[1] TRUE
Bu sorunu aşmak için (Bazz'ın işaret ettiği gibi; bkz. ?exists
), Şu inherits
argümanı kullanın :
> exists("data", inherits = FALSE)
[1] FALSE
foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Tabii ki, ekli paketlerin ad alanlarını aramak isterseniz, bu da kısa olur:
> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
Bunu ele almayı düşünebildiğim tek şey - ekli paketlerde arama yapmak, ancak temel paketlerde değil - aşağıdakilerdir:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
( ) Ve ( _object_name_
ile değiştirmeyi karşılaştırın"data.table"
TRUE
"var"
FALSE
)
(elbette, RStudio'da değilseniz, ilk otomatik olarak bağlanan ortamın olduğunu düşünüyorum "package:stats"
)
inherits = FALSE
küresel ortamdaki şeyleri izole ediyor gibi görünüyor. Kulağa doğru geliyor mu?
Tırnak işareti kullanmak istemiyorsanız deparse(substitute())
, aşağıdaki örnek bölümde bulduğum hileyi kullanabilirsiniz ?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
ya böyle işlevde değerlendirmek:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Kuyruk sistemi tarafından bir dizi sonuç oluşturulduğunda olduğu gibi, aradığınız değişkenin adını tam olarak bilmediğiniz durumlar olabilir. Bunlar muhtemelen "ls" ve normal bir ifade bekliyor argümanı "desen" ile ele alınabilir.
"Varoluş" işlevi şu şekilde yeniden uygulanabilir:
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
Bu cevabı hazırlarken, bir fonksiyon içinden ls () çağırırken ortamın spesifikasyonunun gerekliliği konusunda biraz şaşırdım . Bunun için teşekkürler, yığın akışı! Ayrıca true olarak ayarlamam gereken ancak atlamam gereken bir "all.names" özniteliği de vardır.