直接从函数内部修改全局环境不是一个好主意。通常最好只返回一个值并让用户将其附加到需要的地方。(正如 Stibu 解释的那样)。
但是,您还可以使用嵌套环境,例如以下对官方 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...