zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor ver
    Android EditText光标位置(定位到最后)
    Android EditText获取光标位置并插入字符删除字符
    Android 仿微信小视频录制
    Android仿微信小视频录制功能
    Android消息机制之实现两个不同线程之间相互传递数据相互调用
    Android Data Binding 技术
    Android中解析XML
    Android 怎样把光标放在EditText中文本的末尾处?
    Hadoop HBase概念学习系列之RowKey设计(二十九)
  • 原文地址:https://www.cnblogs.com/huanping/p/14561766.html
Copyright © 2011-2022 走看看