2011-07-16 13 views
6

タイトルは自己完結型の質問です。例では、それを明確に:私は環境内のリスト属性の割り当て

g(x) 

$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

いくつかの発言を取得したいのに対し、

x=list(a=1, b="name") 
f <- function(){ 
    assign('y[["d"]]', FALSE, parent.frame()) 
} 
g <- function(y) {f(); print(y)} 

g(x) 

$a 
[1] 1 

$b 
[1] "name" 

を考えてみましょう。私は元の例で何が間違っているか分かっていましたが、それを使って私の目的を明確にしています。 < < - を避けて、親フレームでxを変更したいと思っています。

私は環境についての私の理解は原始的であり、どんな参考文献にも感謝すると思います。

+0

を何をしようとするものです – hadley

+0

非常に大きなオブジェクトを繰り返し呼び出される関数に渡すことを避けようとしています。この関数はオブジェクトの一部も変更します。 – gappy

+0

オブジェクトの周りを回ってプロファイリングしても問題があることを発見しましたか?Rはobjをコピーしませんとにかくあなたがここでやっているそれを変更しない限りこの複雑なアプローチが実際に時間を節約することは明らかではありません。 – hadley

答えて

6

assignの最初の引数は、式の文字表現ではなく、変数名でなければなりません。 fを交換してみてください:

f <- function() with(parent.frame(), y$d <- FALSE) 

abdがリストコンポーネントではなく、リストの属性であること。また、

f <- function() with(parent.frame(), attr(y, "d") <- FALSE) 

あなたはそれを(あるいはないかもしれないが)何をしたいかに依存して持っている方がよいことに注意してください:私たちはfの親フレームにyに属性"d"を追加したい場合は、我々はこれを行うだろうxは、環境またはprotoオブジェクト(protoパッケージから)です。

3

assignの最初の引数はオブジェクト名である必要があります。 assignの使用は、基本的には、割り当てヘルプページの最後の反例と同じです。お守り:「< <を - 」

> x=list(a=1, b="name") 
> f <- function(){ 
+  assign('x["d"]', FALSE, parent.frame()) 
+ } 
> g <- function(y) {f(); print(`x["d"]`)} 
> g(x) 
[1] FALSE # a variable with the name `x["d"]` was created 

をこれは、あなたが使用したいところかもしれないが、それは一般的に疑わしいと考えられています。

> f <- function(){ 
+  x$d <<- FALSE 
+ } 
> g <- function(y) {f(); print(y)} 
> g(x) 
$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

さらに考え、この演習のためのいずれかの目標が存在しない状態で提供され、用語を無視ガボールがRに特定の意味を持っていますが、あなたの目標ではなかったかもしれない指摘した「属性」。あなたが望むのは出力があなたの仕様に合っているならば、これはその目標を達成しますが、地球環境におけるxの変化は起こっていないことに注目してください。

> f <- function(){ 
+  assign('y', c(x, d=FALSE), parent.frame()) 
+ } 
> g <- function(y) {f(); print(y)} 
> g(x) 
$a 
[1] 1 

$b 
[1] "name" 

$d 
[1] FALSE 

> x # `x` is unchanged 
$a 
[1] 1 

$b 
[1] "name" 

fためparent.frameは外の変数を変更する?gの「内部と呼ばれるかもしれないが、改変は、地球環境に出て伝播しません。

+0

これは、疑わしいことではありません。ローカル環境の外での割り当てです。 – hadley

関連する問題