让R在库目录中查找文件

6
我正在使用Linux上的R,涉及IT技术。我有一组经常使用的函数,并将它们保存在不同的.r脚本文件中,这些文件位于~/r_lib/目录下。
我想要包含这些文件,而无需使用完全限定名称,只需使用"file.r"即可。基本上,我正在寻找与C++编译器中的-I相同的命令。
是否有一种方法可以在.Rprofile或.Renviron文件中设置包含文件?
谢谢

1
为了采用稍微不同的方法,您可以考虑将file.r打包成一个包。我有一个长时间类似于你的工作流程,然后有人指导我去使用roxygen。由于我已经相当努力地注释了我的初始文件,因此将其转换为roxygen格式是一项非常简单的任务。 - Chase
打造自己的软件包,让所有函数尽在指尖。比吃蛋糕还要容易。我在这里记录了我的经验:http://danganothererror.wordpress.com/2010/07/23/building-an-r-package-under-windows-without-c-c-or-fortran-code/ - Roman Luštrik
4个回答

5
您可以在?source的示例部分中使用sourceDir函数:
sourceDir <- function(path, trace = TRUE, ...) {
   for (nm in list.files(path, pattern = "\\.[RrSsQq]$")) {
      if(trace) cat(nm,":")           
      source(file.path(path, nm), ...)
      if(trace) cat("\n")
   }
}

你可能希望使用sys.source来避免杂乱无章地占用全局环境。


1

如果您将源文件的chdir参数设置为TRUE,则包含文件中的source调用将相对于其路径。因此,您可以调用:

source("~/r_lib/file.R",chdir=T)

最好不要在你的“库”中包含源调用并将你的代码打包成一个包,但有时这样做很方便。


请参考source命令的chdir参数。 - hadley
@hadley 谢谢!我已经相应地更新了我的答案。我寻找了这样一个参数来“source”,但显然不够努力。 - Jonathan

0

获取您目录中的所有文件,在您的情况下

d <- list.files("~/r_lib/")

然后您可以使用plyr包的函数加载它们

library(plyr)  
l_ply(d, function(x) source(paste("~/r_lib/", x, sep = "")))

如果你喜欢的话,也可以使用循环或者使用其他函数代替 l_ply。传统的循环:

for (i in 1:length(d)) source(paste("~/r_lib/", d[[i]], sep = ""))

0

你想编写自己的source()包装器吗?

mySource <- function(script, path = "~/r_lib/", ...) {
    ## paste path+filename
    fname <- paste(path, script, sep = "")
    ## source the file
    source(fname, ...)
}

你可以把这个代码放到你的.Rprofile文件中,这样每次启动R时都会被加载。

如果你想要加载所有的R文件,你可以很容易地扩展上述代码以一次性加载所有文件。

mySource <- function(path = "~/r_lib/", ...) {
    ## list of files
    fnames <- list.files(path, pattern = "\\.[RrSsQq]$")
    ## add path
    fnames <- paste(path, fnames, sep = "")
    ## source the files
    lapply(fnames, source, ...)
    invisible()
}

实际上,你最好开始自己的私有包并加载它。

通常最好使用 file.path 来创建路径。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接