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

这样是不是挺不错了,嘻嘻.

参考

https://www.jianshu.com/p/43a00debf672

原文地址:https://www.cnblogs.com/huanping/p/14561766.html