おそらく新しいパッケージを開発するために、数十の関数を定義した場合、ls()
コマンドを使用して多くの関数名の中から特定の変数の名前を見つけるのは困難です。
ほとんどの場合、関数名を探していません-それらが存在することはすでにわかっています-しかし、変数に割り当てた名前を見つけたいと思います。
それを解決するためのアイデアは高く評価されています。
おそらく新しいパッケージを開発するために、数十の関数を定義した場合、ls()
コマンドを使用して多くの関数名の中から特定の変数の名前を見つけるのは困難です。
ほとんどの場合、関数名を探していません-それらが存在することはすでにわかっています-しかし、変数に割り当てた名前を見つけたいと思います。
それを解決するためのアイデアは高く評価されています。
関数にこれを実行させたい場合は、ls()
調べる環境を少し試してみる必要があります。通常の使用法では、以下の実装は、関数の親フレームにオブジェクトをリストすることで機能します。トップレベルで呼び出されます。
lsnofun <- function(name = parent.frame()) {
obj <- ls(name = name)
obj[!sapply(obj, function(x) is.function(get(x)))]
}
> ls()
[1] "bar" "crossvalidate" "df"
[4] "f1" "f2" "foo"
[7] "lsnofun" "prod"
> lsnofun()
[1] "crossvalidate" "df" "f1"
[4] "f2" "foo" "prod"
これを書いたので、一連の入れ子関数呼び出しでこの方法を呼び出す必要があるかどうかのname
引数を渡すことができます。ls()
また、関数であるかどうかをテストするときに、get()
によって指定されたオブジェクトに注意する必要があります。ls()
だからおそらく
ls()[!ls()%in%lsf.str()]
JoshO'Brienの提案は使用することでした
setdiff(ls(), lsf.str())
その関数は、いくつかの変換とチェックの後、呼び出します
x[match(x, y, 0L) == 0L]
これは私が最初に提案したものにかなり近いですが、関数にうまく詰め込まれていますsetdiff
。
グローバル環境内のオブジェクトを並べ替えてデータオブジェクトを関数から分離しようとするよりも、関数を別の環境に格納して、ls()
それらがリストされないようにすることをお勧めします(デフォルトではグローバル環境内のもののみがリストされます)。ただし、引き続きアクセス可能であり、必要に応じて一覧表示できます。
これを行う最良の方法は、関数を含むパッケージを作成することです。これは時々思われるほど難しくはありませんpackage.skeleton
。開始するために使用してください。
もう1つの方法は、関数を使用してsave
すべての関数をファイルに保存し、それらをグローバル環境から削除してから、attach
関数を使用してこのファイル(したがってすべての関数)を検索パスに添付することです。
次の関数lsos
は以前にstackoverflow(リンク)に投稿されました-サイズに基づいてRセッションにロードされたオブジェクトの適切な順序を提供します。関数の出力にはオブジェクトのクラスが含まれ、後でフィルタリングして非関数オブジェクトを取得できます。
source("lsos.R")
A <- 1
B <- 1
C <- 1
D <- 1
E <- 1
F <- function(x) print(x)
L <- lsos(n=Inf)
L[L$Type != "function",]
これは次を返します:
> lsos(n=Inf)
Type Size Rows Columns
lsos function 5184 NA NA
F function 1280 NA NA
A numeric 48 1 NA
B numeric 48 1 NA
C numeric 48 1 NA
D numeric 48 1 NA
E numeric 48 1 NA
または、フィルターを使用すると、関数F
は返されません。
> L[L$Type != "function",]
Type Size Rows Columns
A numeric 48 1 NA
B numeric 48 1 NA
C numeric 48 1 NA
D numeric 48 1 NA
E numeric 48 1 NA
では、関数ではなく、変数名だけが必要ですか?これはそれを行います。
ls()[!sapply(ls(), function(x) is.function(get(x)))]
私はこの関数を自分の中に保持してい.rprofile
ます。あまり使用しませんが、グローバル環境に複数の環境、関数、オブジェクトがある場合に最適です。明らかにBenBarnesのソリューションほどエレガントではありませんが、構文を覚えておく必要はなくlsa()
、必要に応じて呼び出すことができます。これにより、特定の環境を一覧表示することもできます。例えばlsa(e)
lsa <- function(envir = .GlobalEnv) {
obj_type <- function(x) {
class(get(x))
}
lis <- data.frame(sapply(ls(envir = envir), obj_type))
lis$object_name <- rownames(lis)
names(lis)[1] <- "class"
names(lis)[2] <- "object"
return(unrowname(lis))
}