R函数执行函数

时间:2016-11-08 22:25:46

标签: r r-package

我试图将相当大的R脚本中使用的常用代码行分解为封装函数......但是,它们似乎在调用时似乎没有运行预期的代码。我觉得我错过了一些关于R如何工作的概念性片段,或者一般的函数式编程。

示例:

这是我要打电话来清理工作区的一段代码 -

clearWorkSpace <- function() {
  rm(list= ls(all=TRUE))
}

如上所述,函数内部的代码按预期执行,但是如果调用父函数,则不会清除环境。

同样,这是一个旨在加载所有依赖文件的函数 -

loadDependencies <- function() {
  dep_files <- list.files(path="./dependencies")
  for (file in dep_files) {
    file_path <- paste0("./dependencies/",file)
    source(file_path,local=TRUE)
  }
}

如果可能的话,能够将代码封装到易于阅读的功能中会很棒。感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您所谓的工作区更适合称为全局环境

函数在自己的环境中执行。例如,这就是为什么在全局环境中看不到中定义的变量的原因。此外,函数如何知道使用函数体中定义的名为x的变量,而不是您在全局环境中可能遇到的某些x

大多数功能都不会修改外部环境,这很好!这是函数式编程范例。修改环境的函数(例如rmsource)通常会使用参数,以便您可以明确修改哪个环境。如果查看?rm,您将看到envir参数,该参数大多数是详细信息部分所描述的内容。 source有一个local参数:

  

local - TRUEFALSE或环境,确定解析表达式的评估位置。 FALSE(默认值)对应于用户的工作空间(全局环境),TRUE对应于source被调用的环境。

当您调用local = TRUE时明确设置sourcesource明确告诉clearWorkSpace仅修改本地(在函数内部)环境,因此您的全局环境当然不受影响!< / p>

为了使您的功能按照我的假设而工作,您可以像这样修改clearWorkSpace <- function() { rm(list= ls(all=TRUE, envir = .GlobalEnv), envir = .GlobalEnv) }

loadDependencies

而对于local = TRUE,只需删除local = FALSE。 (或者更明确地设置local = .GlobalEnvloadDependencies = function() { invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source)) } )虽然你可以用更像R的方式重写它:

invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source))

对于这两种情况(尤其是上面运行的简化依赖关系)我会质疑你是否真的需要将这些包含在函数中。当您恢复项目工作并将CS241-01:x:791:791:CS241-01:/home/CS241-01:/bin/bash CS241-02:x:892:892:CS241-02:/home/CS241-02:/bin/korn CS241-03:x:907:907:CS241-03:/home/CS241-03:/bin/bash CS241-04:x:794:794:CS241-04:/home/CS241-04:/bin/bash CS241-05:x:795:795:CS241-05:/home/CS241-05:/bin/bash CS241-06:x:796:796:CS241-06:/home/CS241-06:/bin/korn CS241-07:x:797:797:CS241-07:/home/CS241-07:/bin/bash CS241-08:x:798:798:CS241-08:/home/CS241-08:/bin/bash CS241-09:x:799:799:CS241-09:/home/CS241-09:/bin/korn CS241-10:x:800:800:CS241-10:/home/CS241-10:/bin/bash CS241-11:x:801:801:CS241-11:/home/CS241-11:/bin/korn CS241-12:x:802:802:CS241-12:/home/CS241-12:/bin/bash CS241-13:x:803:803:CS241-13:/home/CS241-13:/bin/bash CS241-14:x:805:805:CS241-14:/home/CS241-14:/bin/korn CS241-15:x:804:804:CS241-15:/home/CS241-15:/bin/bash 保留在脚本顶部时,可能会更好地养成重新启动R的习惯......

有关环境的更多信息,请The Evironments Section of Advanced R。值得注意的是,有几种方法可以指定可能对不同用例有用的环境,而不是硬编码全局环境。

答案 1 :(得分:1)

理论上你只需做一些事情:

 rm(list= ls(all=TRUE, envir = .GlobalEnv))

我的意思是你明确地设置环境(即使这里使用pos参数更好)。但这也将删除clearWorkSpace函数,因为它是在全局环境中定义的。因此,这将通过递归调用失败。

我个人从未在函数或本地调用中使用rm。我的理解是rm 打算从控制台调用来清除工作空间。