R 函数内变量的保存
前言
以我不多的的编程经验来看,R相比其他语言,可以很方便的保存以及加载变量。save
可以指定多个变量来多个变量,save.image
用于保存当前环境的全局变量。
运用函数,我们可以把经常运行的多行代码封装起来。运行时,直接调用函数,就可以一次执行多个操作。但是虽然我们用函数简单封装了个流程,大多情况,我们可能也只需最后的运行结果,但有时,我们还是需要中间的运行变量,做一些检查,分析操作等。即,我们需要保存函数内的局部变量。
函数内变量保存
假设我们有这么一个简单函数,通过save
,就可以直接保存多个变量了。
ab <- function(addNum, rdata.path){
a <- c(1,2,3) + addNum
b <- c(1,2,3) + addNum
save(a, b, file =rdata.path)
}
ab(10, "~/tmp/test.10.RData")
-----------------------------------------------------------------------
> load("~/tmp/test.10.RData")
> a
[1] 11 12 13
> b
[1] 11 12 13
但是这有个不好的问题是,函数内的变量很多的话,一个一个的写上就比较麻烦。save.image
是保存全局变量的,就算再函数内部调用也无法保存。
进而改进一下,使用ls
获取函数内的变量名,ls
自动获取当前环境的变量,在函数内运行的话,会获取函数的变量,而不是全局变量。
ab <- function(addNum, rdata.path){
a <- c(1,2,3) + addNum
b <- c(1,2,3) + addNum
save(list=ls(), file = rdata.path)
}
ab(100, "~/tmp/test.100.RData")
-----------------------------------------------------------------------
> ab(100, "~/tmp/test.100.RData")
> a
[1] 101 102 103
> b
[1] 101 102 103
这样看起来是不错了。但是有个问题。后面加载的变量会覆盖前一个变量。
> load("~/tmp/test.100.RData")
> load("~/tmp/test.10.RData")
> a
[1] 11 12 13
> b
[1] 11 12 13
所以,我们需要改进一下,变量的加载。我们将变量加载到一个新的环境里,而不是加载当前工作环境中。
LoadToEnv <- function(RData, env = new.env()){
load(RData, env) #### 这里将RData加载到新环境里了
return(env)
}
---------------------------------------------------------------------------
> ab10 <- LoadToEnv("~/tmp/test.10.RData")
> ab100 <- LoadToEnv("~/tmp/test.100.RData")
> ab10$a
[1] 11 12 13
> ab100$a
[1] 101 102 103
> ab10$b
[1] 11 12 13
> ab100$b
[1] 101 102 103
这样是不是挺不错了,嘻嘻.