これは非常に複雑な質問のように思えるかもしれませんが、しばらくの間、私は少し頭がおかしくなります。それは好奇心のためでもあります。なぜなら、私はすでに必要なことをする方法を持っているので、それほど重要ではありません。
Rでは、ユーザーが入力したすべての引数と値を含む名前付きリストオブジェクトを返す関数が必要です。このために私はこのコードを作成しました(おもちゃの例):
foo <- function(a=1, b=5, h='coconut') {
frm <- formals(foo)
parms <- frm
for (i in 1:length(frm))
parms[[i]] <- get(names(frm)[i])
return(parms)
}
だからこれが尋ねられたとき:
> foo(b=0)
$a
[1] 1
$b
[1] 0
$h
[1] "coconut"
この結果は完璧です。問題は、私lapply
が同じ目標を使用しようとすると、もう少し効率的(かつエレガント)になるように、私が望むように機能しないということです:
foo <- function(a=1, b=5, h='coconut') {
frm <- formals(foo)
parms <- lapply(names(frm), get)
names(parms) <- names(frm)
return(parms)
}
get
問題は明らかに、最初の引数(文字列、変数の名前)を評価する環境にあります。これは私がエラーメッセージから部分的に知っています:
> foo(b=0)
Error in FUN(c("a", "b", "h")[[1L]], ...) : object 'a' not found
また、.GlobalEnv
環境内に正しい名前のオブジェクトがある場合、fooは代わりにそれらの値を返します。
> a <- 100
> b <- -1
> h <- 'wallnut'
> foo(b=0)
$a
[1] 100
$b
[1] -1
$h
[1] "wallnut"
明らかに、get
デフォルトでで評価されるように、現在の関数のオブジェクトではなく、環境parent.frame()
内のオブジェクトを検索します。.GlobalEnv
これは、関数の最初のバージョンでは発生しないため、奇妙です。
適切な環境で評価する関数を作成するために多くのオプションを試しget
ましたが、正しく実行できませんでした(オプションとして試しましたpos=-2,0,1,2
)envir=NULL
。
特にこの「奇妙な」場合に、誰かが私より少し環境について知っているなら、私はこれを解決する方法を知りたいです。
御時間ありがとうございます、
ファン