是否可以env()用作名称空间的替代品,如何在向其添加函数之前检查环境是否存在?
这与这个问题有关,而Brendan的建议 如何组织大型R程序? 我理解Dirk在这个问题上的观点,但是对于开发而言,将函数放入包中有时是不切实际的.
编辑:这个想法是跨文件模仿名称空间,因此能够独立加载不同的文件.如果先前已加载文件,则不需要创建环境,只需添加到.
谢谢你的想法
编辑:所以下面的代码可能相当于其他语言的命名空间: -
# how to use environment as namespaces
# file 1
# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) }
e$f1 <- function(x) {1}
# file 2
# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) }
e$f2 <- function(x) {2}
Run Code Online (Sandbox Code Playgroud)
是的,你可以在大多数情况下.每个函数都有一个环境,它就是寻找其他函数和全局变量的地方.通过使用您自己的环境,您可以完全控制它.
通常,函数也会分配给环境(通过将它们分配给名称),通常这两个环境是相同的 - 但并非总是如此.在包中,命名空间环境用于两者,但是搜索路径上的(不同)包环境也定义了相同的(导出的)功能.所以环境不同.
# this will ensure only stats and packages later on the search list are searched for
# functions from your code (similar to import in a package)
e <- new.env(parent=as.environment("package:stats"))
# simple alternative if you want access to everything
# e <- new.env(parent=globalenv())
# Make all functions in "myfile.R" have e as environment
source("myfile.R", local=e)
# Or change an existing function to have a new environment:
e$myfunc <- function(x) sin(x)
environment(e$myfunc) <- e
# Alternative one-liner:
e$myfunc <- local(function(x) sin(x), e)
# Attach it if you want to be able to call them as usual.
# Note that this creates a new environment "myenv".
attach(e, name="myenv")
# remove all temp objects
rm(list=ls())
# and try your new function:
myfunc(1:3)
# Detach when it's time to clean up or reattach an updated version...
detach("myfile")
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,e对应于命名空间,附加的"myenv"对应于包环境(如搜索路径上的"package:stats").
您可以像检查任何其他变量一样检查环境是否存在。
e <- new.env()
exists("e") && is.environment(e)
Run Code Online (Sandbox Code Playgroud)