我正在编写一些用于执行重复任务的函数,但我试图尽量减少加载数据的次数。基本上,我有一个函数可以获取一些信息并绘制图表。然后我有第二个函数,它将循环并将多个图输出到.pdf。在这两个函数中,我都有以下代码行:
if(load.dat) load("myworkspace.RData")
whereload.dat
是逻辑的,我需要的数据存储在 myworkspace.RData 中。当我调用循环并输出多个图的包装函数时,我不想在每次调用内部函数时重新加载工作区。我以为我可以在包装函数中加载一次工作区,然后内部函数可以访问该数据,但我得到一个错误说明。
所以我的理解是当一个函数在其本地环境中找不到变量时(在函数被调用时创建),该函数将在父环境中查找该变量。
我假设内部函数调用的父环境将是外部函数调用。显然这不是真的:
func1 <- function(...){
print(var1)
}
func2 <- function(...){
var1 <- "hello"
func1(...)
}
> func2()
Error in print(var1) : object 'var1' not found
在阅读了许多问题、语言手册和这篇非常有用的博客文章之后,我想出了以下几点:
var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)
func3 <- function(...){
attach("test.RData")
func1(...)
detach("file:test.RData")
}
> func3()
[1] "hello"
有一个更好的方法吗?当它被调用时,为什么不在func1
本地环境中寻找未定义的变量?func2
func2
func1
注意:我不知道如何命名这个问题。如果有人有更好的建议,我会更改并编辑此行。