如何在现有环境中添加功能

use*_*er4 6 r

是否可以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)

Tom*_*mmy 6

是的,你可以在大多数情况下.每个函数都有一个环境,它就是寻找其他函数和全局变量的地方.通过使用您自己的环境,您可以完全控制它.

通常,函数也会分配给环境(通过将它们分配给名称),通常这两个环境是相同的 - 但并非总是如此.在包中,命名空间环境用于两者,但是搜索路径上的(不同)包环境也定义了相同的(导出的)功能.所以环境不同.

# 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").


Ric*_*ton 2

您可以像检查任何其他变量一样检查环境是否存在。

e <- new.env()
exists("e") && is.environment(e)
Run Code Online (Sandbox Code Playgroud)