R
どのデータセットが添付されているかを調べる方法はありますか? 私のワークフローでは、コンソールを使用してスクリプトを作成します。コンソールでコード行を試し、満足のいく結果が得られたら、スクリプトに追加して、後で結果を再現できるようにします。先週、私はいくつかのデータセットで遊んでいました。時間をかけて何枚も付けたり外したりしたと思います。しかし今、どのデータセットが現在アタッチされているかを知り、デタッチできるようにする必要があります。
4 に答える
コマンドを検索していると思いますsearch()
。これにより、添付したデータフレームとパッケージが表示されます。
また、入力help(search)
して、それが何をしているかを確認します。
search()
アタッチされているオブジェクトを見つけるために使用します。
これにより、添付されているすべてのパッケージについてもわかるため、正規表現を使用して検索結果からパッケージを削除できます。
添付mtcars
:
attach(mtcars)
The following object(s) are masked from 'package:ggplot2':
mpg
ここsearch()
で、正規表現を使用します。
attached <- search()
attached[!grepl("package", attached)]
[1] ".GlobalEnv" "mtcars" "tools:rstudio" "Autoloads"
コメントの提案に沿って答えを出すために、コードを 3 つの部分に分けています。1 つ目は、添付されたデータセットのリストを単純に生成します。2 番目は、添付されたデータセットの 1 つのインスタンスを削除します。3 番目は、データセットが複数回アタッチされた状況を処理します。
1.添付データセット一覧出力
このコードは、ユーザーが調べるために添付されたデータセットのリストを生成します。
intersect(search(), objects())
"character(0)" を取得した場合 - グローバル環境にアタッチされたデータ オブジェクトはありません
2. 自動的に「クリーンアップ」し、添付されたすべてのデータセットを切り離します
このコードは、添付されたデータセットのリストを取得し、添付されたすべてのオブジェクト (データセット) を切り離します。非オブジェクトはそのままにしておく必要があります。したがって、グローバル環境を「クリーンアップ」するのは、かなりシンプルで、安全で、信頼できる方法です。
注: これは、各オブジェクトが 1 回だけアタッチされている場合にのみ機能します。それ以外の場合は、コマンドを再度実行する必要があります。回答の次の部分では、このケースも処理します。
#works if only attached each object once
lapply(X = intersect(search(), objects()),
FUN = function(X){detach(name = X, character.only = TRUE)})
3. オブジェクトが複数回アタッチされている場合でも、すべてデタッチします
3(a) 複数のアタッチメント このコードは、複数回アタッチされている場合でも、アタッチされているすべてのオブジェクト (データセット) をデタッチします。ユーザーがオブジェクトを 2 回アタッチしたとしても、R はオブジェクトの名前を 2 回含めないため、上記の操作ではこれを処理できません。
そう:
attach(data.df)
intersect(search(), objects())
と、
attach(data.df)
attach(data.df)
attach(data.df)
intersect(search(), objects())
同じ出力が生成されます: [1] "data.df"
後者の場合でもdetach(data.df)
、グローバル環境をクリアするには 3 回呼び出す必要があります。その結果、パート 2 の回答をループに入れる必要があります。
3(b) ユーザーへの出力の生成 さらに、クリーンアップは、成功した「detach()」操作ごとにデータセット名のリストを出力します。これにより、ユーザーは、どのデータセットが何回分離されたかを知ることができます。
注: これは少しクリーンアップされる可能性があると確信していますが、このコードは確実にジョブを実行します。
# the repeat handles cases where objects of identical name were
# attached (or, object was attached twice by mistake).
# It also outputs the name of objects as they are detached.
repeat{
x <- lapply(X = intersect(search(), objects()),
FUN = function(X){detach(name = X, character.only = TRUE)})
y <- lapply(x, function(X){cat(attr(X,"name"), "\n")})
if(identical(x, list())){break}
}
この問題を回避するには、データセットに対してアタッチとデタッチを使用しないことをお勧めします。2 つ以上のアタッチされたデータセット (および場合によってはグローバル環境) で同じ変数が定義されていて、誤って間違った変数を取得するという問題に遭遇することもあります。plot
やなどの関数には data 引数を使用し、それ以外の場合には 、、 などのlm
関数を使用することをお勧めします。次に、R は指定されたデータセットを常に最初に検索し、後でアタッチしたままにしません。with
within
transform