オブジェクト(変数)がRで定義されているかどうかを確認する方法


294

エラーが発生することなく、Rで変数が定義されているかどうかを確認したいと思います。これどうやってするの?

私の試み(成功しなかった):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

ありがとう!

回答:


448

あなたが欲しいexists()

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 

3
@Gavin&Dirk、あなたはお互いにとても親切です:)唯一の解決策は、コインを投げることです(p = 0.5のベルヌーイ:-))誰が受け入れます!:-)
TMS

29
関数内にいる場合は、timing()が必要です。
CousinCocaine 2014年

2
リスト要素をチェックする場合、少しトリッキーになる可能性があります:stackoverflow.com/q/7719741
TMS

5
opが望んでいたことについてはどうですか-引用符ではなく変数名を使用しますか?
ティム2013年

109

?exists「...が定義されている」の定義については、を参照してください。例えば

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE

7
52秒で勝つ:)
Dirk Eddelbuettel、2012

9
@DirkEddelbuettelええと、とてつもなく長いオブジェクト名を使用する場合;-)
Gavin Simpson

2
へへ。投稿する前に例をテストしているときはいつも私に起こりますが、GavinまたはJoshはすでにそれに答えています。
舞浅浦

60

関数内にいる場合は、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
Dannid

45

他の人が指摘したように、あなたは探していexistsます。existsRの基本パッケージで使用されている名前で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"


2
遊んで、引数を使用するinherits = FALSEと、地球環境の中で物事を分離するようです。いいですか?
CJB 2016年

1
@Bazzあなたは正しいです。これを回答に編集しました。
MichaelChirico 2016

2
私は変数名 "data"を使用しているため、このコメントはもっと上になるはずです。existを使用するだけで、最初は問題が発生しました。
mzm

25

引用符を使用したくない場合は、次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

1
あなたもできますforceか、このような機能で、それを評価:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
chinsoon12

1

結果の配列がキューイングシステムによって作成された場合など、探している変数の名前が正確にわからない場合があります。これらは「ls」とその正規表現を期待する引数「パターン」で対処できる可能性があります。

「exists」関数は、そのように再実装できます。

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

この回答を準備しているときに、関数内からls()を呼び出すときに環境を指定する必要があることに少し驚きました。だから、それをありがとう、stackoverflow!「all.names」属性もあり、trueに設定する必要がありましたが、省略しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.