代码之家  ›  专栏  ›  技术社区  ›  Jeromy Anglim

如何使用r中的ProjectTemplate在lib目录中自动加载r脚本?

r
  •  0
  • Jeromy Anglim  · 技术社区  · 5 年前

    最近有人在推特上问我:

    ProjectTemplate in R似乎只从中导入R脚本 lib 文件夹,而不是嵌套的子目录。

    如何在中导入R脚本文件 解放党 使用时的目录 ProjectTemplate::load.project() 脚本文件是否位于子目录中?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jeromy Anglim    5 年前

    我的理解是,没有内置选项来激活ProjectTemplate中lib目录中R脚本的递归加载。

    最简单的选择可能是使用 sourceDirectory 对于每个嵌套目录。例如,如果你有子目录 foo ,然后您可以在lib目录中的一个顶级R脚本中放入以下行(例如。, lib/helpers.R )

    R.utils::sourceDirectory("lib/foo", modifiedOnly = FALSE)
    

    如果您想要适合项目的内容,可以在顶级lib脚本文件中放入以下内容:

    f <- dir("lib", full.names = TRUE)
    f <- f[dir.exists(f)]
    if (length(f) > 0 ) { 
        sapply(f, function(X) R.utils::sourceDirectory(X, modifiedOnly = FALSE))
    }
    

    它将标识 lib 目录然后递归地将所有子目录(如果存在)作为源。

        2
  •  0
  •   JJ Fantini    5 年前

    这是我想出的一个答案,从 lib 归档 ProjectTemplate 建筑学

    get.lib.dir2 <- function (name) { #write the name of the subdirectory lib file to pull
        files <- dir("lib", full.names = TRUE)
        dir <- files[dir.exists(files)]
        choices <- str_remove_all(dir, "(lib/)")
        
        args <- try(match.arg(name, choices = choices, several.ok = T), silent = T)
        
        if(berryFunctions::is.error(args)) {
            warning(paste0("No such directory exists\n", "Please change <name>"))
        } else {
            cat(paste0("You selected: ", args, " directory\n"))
        }
        
        
        dir_get <-  sapply(name, \(x) grep(x, dir, value = T))
        
        if (args %in% choices) {
            dir_get <-  sapply(name, \(x) grep(x, dir, value = T))
            sapply(dir_get, \(X) miceadds::source.all(X))
        }
    }
    

    不过,它不会将变量源化到环境中