Jawaban:
Anda ingin exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Lihat ?exists
, untuk beberapa definisi "... didefinisikan". Misalnya
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
jika Anda berada di dalam suatu fungsi, missing () adalah apa yang Anda inginkan.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
Namun, hanya berfungsi untuk argumen fungsi. Anda tidak dapat melakukannya foo <- function(x) {missing(x); missing(y)}
atau Anda akan mendapatkannya foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Seperti yang ditunjukkan orang lain, Anda sedang mencari exists
. Perlu diingat bahwa menggunakan exists
dengan nama yang digunakan oleh paket dasar R akan mengembalikan true terlepas dari apakah Anda mendefinisikan variabel:
> exists("data")
[1] TRUE
Untuk menyiasati ini (seperti yang ditunjukkan oleh Bazz; lihat ?exists
), gunakan inherits
argumen:
> exists("data", inherits = FALSE)
[1] FALSE
foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Tentu saja, jika Anda ingin mencari ruang nama paket terlampir, ini juga akan gagal:
> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
Satu-satunya hal yang dapat saya pikirkan untuk mengatasi ini - untuk mencari dalam paket terlampir tetapi tidak dalam paket dasar - adalah sebagai berikut:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
Bandingkan penggantian _object_name_
dengan "data.table"
( TRUE
) vs. "var"
( FALSE
)
(tentu saja, jika Anda tidak menggunakan RStudio, saya pikir lingkungan yang terlampir secara otomatis adalah "package:stats"
)
inherits = FALSE
tampaknya mengisolasi hal-hal di lingkungan global. Apakah itu benar?
Jika Anda tidak ingin menggunakan tanda kutip, Anda dapat menggunakan deparse(substitute())
trik yang saya temukan di bagian contoh ?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
atau mengevaluasinya dalam fungsi seperti ini:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Mungkin ada situasi di mana Anda tidak tahu persis nama variabel yang Anda cari, seperti ketika array hasil telah dibuat oleh sistem antrian. Ini mungkin dapat diatasi dengan "ls" dan "pola" argumennya yang mengharapkan ekspresi reguler.
Fungsi "ada" dapat diimplementasikan kembali seperti itu
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
Sambil mempersiapkan jawaban ini, saya sedikit terkejut tentang perlunya kebutuhan spesifikasi lingkungan ketika memanggil ls () dari dalam suatu fungsi. Jadi, terima kasih untuk itu, stackoverflow! Ada juga atribut "all.names" yang seharusnya saya atur menjadi true tetapi telah dihilangkan.