执行函数的 R 函数

标签 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)
  }
}

如果可能的话,如果能够将代码封装成易于阅读的函数那就太好了。提前感谢您的帮助。

最佳答案

您所说的工作区更准确地称为全局环境

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

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

local - TRUE, FALSE or an environment, determining where the parsed expressions are evaluated. FALSE (the default) corresponds to the user's workspace (the global environment) and TRUE to the environment from which source is called.

在调用 source 时显式设置 local = TRUE,这显式告诉 source 仅修改本地(函数内部)环境,所以当然你的全局环境没有受到影响!


为了使您的函数按照我假设的方式工作,您可以像这样修改 clearWorkSpace:

clearWorkSpace <- function() {
  rm(list= ls(all=TRUE, envir = .GlobalEnv), envir = .GlobalEnv)
}

对于loadDependency,只需删除local = TRUE。 (或者更明确地设置 local = FALSElocal = .GlobalEnv)尽管您可以以更像 R 的方式重写它:

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

对于这两个(尤其是上面运行的简化依赖项),我会质疑您是否真的需要将它们包装在函数中。最好养成在恢复项目工作时重新启动 R 并保持 invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source)) 的习惯 在脚本的顶部...


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

关于执行函数的 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497495/

相关文章:

r - 如何将 application_name 发送到 RPostgreSQL 连接

r - 并行处理的句子生成会产生乱码结果

c - 如何在 R 包中调用 C 函数

r - 创建 R 包时如何使用 roxygen2 编辑 NAMESPACE?

r - R 中矩阵下的匹配(查找)

r - 使用 R 在 ggplot2 中自定义几何文本颜色

从数据集中删除提及次数太少的项目

R 包 : writing internal data, 但不是一次全部

r - 在 CRAN 包中包含非 CRAN 包

r - 如何从 wordcloud R 包中删除单词以便它们可以包含在输出中?