回答:
あなたが欲しい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
関数内にいる場合は、missing()が必要です。
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の基本パッケージで使用されている名前でwith を使用すると、変数を定義したかどうかに関係なく、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」とその正規表現を期待する引数「パターン」で対処できる可能性があります。
「exists」関数は、そのように再実装できます。
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
この回答を準備しているときに、関数内からls()を呼び出すときに環境を指定する必要があることに少し驚きました。だから、それをありがとう、stackoverflow!「all.names」属性もあり、trueに設定する必要がありましたが、省略しています。