2016-05-13 4 views
3

タイトルに記載されているように、文字列を含むベクトルをループしています。これはdata.framesの名前でも、そうであってもかまいません。それはベクトルである必要はありませんが、実際には1つの列を抽出したdata.frameでした。ベクトルをループして同じ名前のdata.framesが存在するかどうかを確認します

tables <- as.vector(df.stattributes.run[,1]) 

これは

テーブル [1] "t検定" "ttest2" "mtcars"

を与えるその後、私は始めている:ここに は、私が試したものですループ

for (i in 1:length(tables)) 
    {try(if(!is.data.frame(as.name(tables[i])) == TRUE) stop(paste("Table",tables[i],"doesn't exist.")) else print(paste("Table",tables[i],"found")))} 

これは常に "テーブル...が見つかりません。 " mtcarsは既存のdata.frameです。それを機能させるために私は何を変えることができますか? ありがとうございました!

答えて

5

あなたはinherits=Tifnotfound=list(NULL)(または任意の非data.frame値)でmget()を使用し、それぞれにis.data.frame()を適用することができます。

sapply(mget(tables,inherits=T,ifnotfound=list(NULL)),is.data.frame); 
## ttest ttest2 mtcars 
## FALSE FALSE TRUE 

inherits=Tがここに必要な理由は、mtcarsにはないということですグローバル環境に存在します。これは、mget()がトップレベルで実行するときにデフォルトで表示される場所です。実際には、組み込みデータセットパッケージのパブリック環境に存在します。

find('mtcars'); 
## [1] "package:datasets" 

また、私はここに対処すべきいくつかの誤解があります:あなたは、オブジェクトが存在する場所を特定するためにfind()を使用することができます。 as.name()の機能は、​​とまったく同じです。これらの関数は与えられた引数をシンボル型に変換します。

シンボルタイプは、R言語自体のRの表現の一部、つまりRデータタイプを使用するR構文解析ツリーの一部です。別の言い方をすると、これはRのRデータモデルの一部であると言えるかもしれません。これに関する詳細は私の答えhereを参照してください。

多くの場合、ほとんどのRプログラマは、しばしば呼び出されるように(つまり、R構文解析ツリーを操作する必要がないため)、言語で「計算する」必要がないため、シンボルを扱う必要はありません)。

コードでtables[i]の文字列値をas.name()を使用して記号の種類に変換し、結果のシンボルオブジェクトをis.data.frame()に渡します。これは間違っています。記号オブジェクトがis.data.frame()を呼び出すと、シンボルはdata.frameではないため、常にfalseが返されます。一般的に、is.*関数は、与えられたオブジェクトのタイプで動作します。彼らはではない引数が参照する最終的なオブジェクトを見つけるために、あらゆる種類の "解像度"または "ルックアップ"または "検索"を行います。引数は、is.*の機能がタイプテストされているオブジェクトであるです。

2番目の点は、== TRUEを実行する必要はありません。すでに論理値を持っている場合、それはすでに真です。その場合、比較では真のままになります。そうでない場合は偽です。この場合、比較では偽になります(または、既にNAこの場合、比較はNAとしてそれを残す)。


Funnily十分に、上記の説明を書いた後、私は名前文字列値に格納されているオブジェクトを取得するための別の方法があることを実現してきた、そしてそれは実際に私はやや却下​​/as.name()の機能を含んでい上記。私は、シンボルオブジェクトにeval()を呼び出すことについて話している:

head(eval(as.symbol(tables[3L]))); 
##     mpg cyl disp hp drat wt qsec vs am gear carb 
## Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
## Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 
is.data.frame(eval(as.symbol(tables[3L]))); 
## [1] TRUE 

だから私たちは実際にあなたがas.name()を呼び出すことによって、正しい軌道に乗っていたと言うことができます。

+0

ありがとうございます。これは明らかに機能します。面白い私はまたevalで試したが、2つの表現を組み合わせることは私の心には来なかった:) – mariego

+0

あなたは大歓迎です:) – bgoldst

関連する問題