您要使用的主要函数是sys.source(),它将在全局命名空间(R 中的“环境”)中加载您的函数/变量。您可以在 R 中做的另一件很棒的事情是将名称空间附加到您的 search() 路径,这样您就不需要直接引用名称空间。也就是说,如果“namespace1”在您的搜索路径上,则其中的一个函数,比如“fun1”,不需要像 Python 中那样被称为 namespace1.fun1(),而是 fun1()。 【方法解析顺序:】如果有多个同名函数,则调用环境中search()列表中最先出现的那个。要显式调用特定命名空间中的函数,许多可能的语法之一(尽管有点难看)是get("fun1","namespace1")(...),其中... 是fun1() 的参数。这也适用于变量,使用语法get("var1","namespace1")。我一直这样做(我通常只加载函数,但 R 中函数和变量之间的区别很小)所以我编写了一些从我的~/.Rprofile 加载的便利函数。
name.to.env <- function(env.name)
## returns named environment on search() path
pos.to.env(grep(env.name,search()))
attach.env <- function(env.name)
## creates and attaches environment to search path if it doesn't already exist
if( all(regexpr(env.name,search())<0) ) attach(NULL,name=env.name,pos=2)
populate.env <- function(env.name,path,...) {
## populates environment with functions in file or directory
## creates and attaches named environment to search() path
## if it doesn't already exist
attach.env(env.name)
if( file.info(path[1])$isdir )
lapply(list.files(path,full.names=TRUE,...),
sys.source,name.to.env(env.name)) else
lapply(path,sys.source,name.to.env(env.name))
invisible()
}
示例用法:
populate.env("fun1","pathtofile/functions1.R")
populate.env("fun2","pathtofile/functions2.R")
以此类推,这将创建两个独立的命名空间:“fun1”和“fun2”,它们附加到search() 路径(在这种情况下,“fun2”将在search() 列表中更高)。这类似于做类似的事情
attach(NULL,name="fun1")
sys.source("pathtofile/functions1.R",pos.to.env(2))
为每个文件手动设置(“2”是search() 路径上的默认位置)。 populate.env()的写法,如果一个目录,比如“functions/”,包含很多R文件,函数名不冲突,可以这样称呼
populate.env("myfunctions","functions/")
将所有函数(和变量)加载到单个命名空间中。使用name.to.env(),您还可以执行类似的操作
with(name.to.env("fun1"), doStuff(var1))
或
evalq(doStuff(var1), name.to.env("fun1"))
当然,如果您的项目变得很大,并且您有很多很多的函数(和变量),那么编写一个包就是要走的路。