4

おそらく新しいパッケージを開発するために、数十の関数を定義した場合、ls()コマンドを使用して多くの関数名の中から特定の変数の名前を見つけるのは困難です。

ほとんどの場合、関数名を探していません-それらが存在することはすでにわかっています-しかし、変数に割り当てた名前を見つけたいと思います。

それを解決するためのアイデアは高く評価されています。

4

6 に答える 6

5

関数にこれを実行させたい場合は、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()

于 2012-10-26T21:12:40.147 に答える
4

だからおそらく

ls()[!ls()%in%lsf.str()]

JoshO'Brienの提案は使用することでした

setdiff(ls(), lsf.str())

その関数は、いくつかの変換とチェックの後、呼び出します

x[match(x, y, 0L) == 0L]

これは私が最初に提案したものにかなり近いですが、関数にうまく詰め込まれていますsetdiff

于 2012-10-26T21:08:13.247 に答える
4

グローバル環境内のオブジェクトを並べ替えてデータオブジェクトを関数から分離しようとするよりも、関数を別の環境に格納して、ls()それらがリストされないようにすることをお勧めします(デフォルトではグローバル環境内のもののみがリストされます)。ただし、引き続きアクセス可能であり、必要に応じて一覧表示できます。

これを行う最良の方法は、関数を含むパッケージを作成することです。これは時々思われるほど難しくはありませんpackage.skeleton。開始するために使用してください。

もう1つの方法は、関数を使用してsaveすべての関数をファイルに保存し、それらをグローバル環境から削除してから、attach関数を使用してこのファイル(したがってすべての関数)を検索パスに添付することです。

于 2012-10-26T21:33:57.463 に答える
1

次の関数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
于 2012-10-26T21:17:45.567 に答える
1

では、関数ではなく、変数名だけが必要ですか?これはそれを行います。

ls()[!sapply(ls(), function(x) is.function(get(x)))]
于 2012-10-26T21:04:57.610 に答える
0

私はこの関数を自分の中に保持してい.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))
}
于 2012-10-26T21:20:50.757 に答える