Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在现有环境中添加函数_R - Fatal编程技术网

R 如何在现有环境中添加函数

R 如何在现有环境中添加函数,r,R,是否可以使用env()替代名称空间,在向环境添加函数之前如何检查环境是否已经存在 这与这个问题以及布伦丹的建议有关 我理解Dirk在这个问题上的观点,但是对于开发来说,有时将函数放在包中是不切实际的 编辑:其思想是跨文件模拟名称空间,从而能够独立加载不同的文件。如果先前已加载文件,则无需创建环境,只需将其添加到 谢谢你的建议 编辑:因此下面的代码可能与其他语言中的名称空间等效:- # how to use environment as namespaces # file 1 # equiv

是否可以使用
env()
替代名称空间,在向环境添加函数之前如何检查环境是否已经存在

这与这个问题以及布伦丹的建议有关 我理解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}
#如何将环境用作名称空间
#文件1

#如果(!(exists(“e”)&&is.environment(e)){e您可以检查环境是否以与任何其他变量相同的方式存在,这相当于“namespace e”

e <- new.env()
exists("e") && is.environment(e)

e是的,大部分情况下你都可以。每个函数都有一个环境,它在那里寻找其他函数和全局变量。通过使用你自己的环境,你可以完全控制它

通常,函数也被分配给一个环境(通过将它们分配给一个名称),通常这两个环境是相同的,但并不总是相同的。在一个包中,名称空间环境同时用于这两个环境,但搜索路径上的(不同)包环境也具有相同的(导出的)属性函数已定义。因此环境不同

# 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")
#这将确保只搜索搜索列表后面的统计数据和包
#代码中的函数(类似于在包中导入)
名称空间是环境,因此您可以使用完全相同的机制。由于R使用词法作用域,因此环境的父级定义函数将看到的内容(即自由变量的绑定方式)。与名称空间完全一样,您可以附加环境并查找它们

因此,要创建一个新的“手动名称空间”,可以使用

e <- new.env(parent=baseenv())
# use local(), sys.source(), source() or e$foo <- assignment to populate it, e.g.
local({
  f <- function() { ... }
  #...
}, e)
attach(e, name = "mySuperNamespace")
e我将大部分代码组织在软件包中,但使用Hadley的
devtools
软件包将其加载到环境中。这基本上实现了您所描述的功能,但我还有一个额外的优势,即如果需要,我可以构建和重用软件包。(换句话说,我不需要在开发过程中不断地重建包。)