関数内からグローバル環境を直接変更することはお勧めできません。通常は、値を返して、必要な場所にユーザーが追加できるようにする方がよいでしょう。(スティブが説明したように)。
ただし、公式の R 言語定義の例を次のように変更したように、ネストされた環境を使用することもできます。
fruitscollector <- function(){
fruitslist <- NULL
function(){
answer <- as.integer(readline(prompt="How Many?: "))
fruitslist <<- c(fruitslist, answer)
fruitslist
}
}
したがって、「fruitscollector」を最初に初期化すると、値を収集できる関数だけが返されます。
foo <- fruitscollector()
を使用するたびfoo
に、コレクションに値が追加されます (コレクション全体が返されます)。
foo()
foo()
# etc
fruitslist
の親環境に保存される foo
ため、誤って削除できるグローバル環境にはありません。
編集
より一般的なアイデアは、メソッドとして関数を使用してオブジェクト (OOP で「オブジェクト」と呼ばれるものに多少似ています) を作成することです。
collector <- function(){
stack <- NULL
list(
add = function(x) stack<<-c(stack, x),
get = function() stack,
empty = function() stack <<- NULL
)
}
add
メソッドはスタックに追加され、get
メソッドはスタック全体を返し、empty
メソッドはそれを空にします。
foo <- collector() # initialize
foo$get() # NULL
foo$add(1) # add 1 to the stack
foo$get() # 1
foo$add(3) # add 3 to the stack
foo$get() # 1 3
foo$add(1:5) # etc...