我试图将相当大的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)
}
}
如果可能的话,能够将代码封装到易于阅读的功能中会很棒。感谢您的帮助。
答案 0 :(得分:3)
您所谓的工作区更适合称为全局环境。
函数在自己的环境中执行。例如,这就是为什么在全局环境中看不到在中定义的变量的原因。此外,函数如何知道使用函数体中定义的名为x
的变量,而不是您在全局环境中可能遇到的某些x
。
大多数功能都不会修改外部环境,这很好!这是函数式编程范例。修改环境的函数(例如rm
和source
)通常会使用参数,以便您可以明确修改哪个环境。如果查看?rm
,您将看到envir
参数,该参数大多数是详细信息部分所描述的内容。 source
有一个local
参数:
local
-TRUE
,FALSE
或环境,确定解析表达式的评估位置。FALSE
(默认值)对应于用户的工作空间(全局环境),TRUE
对应于source
被调用的环境。
当您调用local = TRUE
时明确设置source
,source
明确告诉clearWorkSpace
仅修改本地(在函数内部)环境,因此您的全局环境当然不受影响!< / p>
为了使您的功能按照我的假设而工作,您可以像这样修改clearWorkSpace <- function() {
rm(list= ls(all=TRUE, envir = .GlobalEnv), envir = .GlobalEnv)
}
:
loadDependencies
而对于local = TRUE
,只需删除local = FALSE
。 (或者更明确地设置local = .GlobalEnv
或loadDependencies = 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
打算从控制台调用来清除工作空间。