是否可以使用env()
作为命名空间的替代品,在向环境添加函数之前如何检查环境是否已经存在?
这与这个问题以及布伦丹的建议有关如何组织大型R程序? https://stackoverflow.com/questions/1266279/how-to-organize-large-r-programs我理解德克在这个问题中的观点,但是对于开发来说,有时将函数放入包中是不切实际的。
编辑:这个想法是模仿跨文件的名称空间,因此能够独立加载不同的文件。如果先前已加载文件,则无需创建环境,只需添加即可。
感谢您的想法
编辑:所以想必下面的代码相当于其他语言中的命名空间:-
# 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}
是的,大多数情况下你可以。每个函数都有一个环境,它在其中查找其他函数和全局变量。通过使用您自己的环境,您可以完全控制它。
通常功能也是assigned到一个环境(通过为它们分配一个名称),通常这两个环境是相同的 - 但并非总是如此。在包中,命名空间环境用于两者,但搜索路径上的(不同)包环境也定义了相同的(导出的)函数。所以那里的环境是不同的。
# 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")
在上面的例子中,e
对应于命名空间,附加的“myenv”对应于包环境(如搜索路径上的“package:stats”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)