Основной функцией, которую вы хотите использовать, является sys.source()
, которая будет загружать ваши функции / переменные в пространство имен («среда» в R), отличное от глобального. Еще одна вещь, которую вы можете сделать в R, которая является фантастической, - это присоединить пространства имен к вашему пути search()
, чтобы вам не нужно было ссылаться на пространство имен напрямую. То есть, если «namespace1» находится на вашем пути поиска, функцию внутри него, скажем «fun1», не нужно вызывать как namespace1.fun1()
как в Python, а как 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"))
Конечно, если ваш проект становится большим и у вас есть много и много функций (и переменных), путь к пакету - это путь.