luc*_*one 6 r devtools r-package
在我的一个包中,我使用.onAttach钩子来运行一些R代码,然后使用它assign来使值可用作包变量之一.我这样做是因为variable取决于某个文件的内容,它可以在一个会话和另一个会话之间切换.我使用的代码如下:
.onAttach <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = as.environment("package:MyRPackage"))
}
Run Code Online (Sandbox Code Playgroud)
当我附上包装时library(MyRpackage)我可以使用variable.
然而,不可能做类似的事情MyRPackage::variable(除非我已经附上了包library(MyRpackage).
我知道这是因为我应该将该代码放在.onLoad钩子中,但是我无法进行赋值以使其工作.
我试过了
.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = as.environment("namesoace:MyRPackage"))
}
Run Code Online (Sandbox Code Playgroud)
和
.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = asNamespace("MyRPackage"))
}
Run Code Online (Sandbox Code Playgroud)
但是当我在MyRPackage:::variable不使用library附加包的情况下运行时,它们都会失败并出现一些错误.
在.onLoad钩子中进行赋值的正确方法是什么?
duc*_*ayr 13
按照相关问题的答案中的方法,您可以改变您的.onLoad()功能:
.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = parent.env(environment()))
}
Run Code Online (Sandbox Code Playgroud)
然后您可以访问variable而无需使用附加包MyRPackage:::variable.我不知道你在做什么some_function(),所以我尝试了以下虚拟包:
.onLoad <- function(libname, pkgname) {
variable <- 42
assign("variable", variable, envir = parent.env(environment()))
}
Run Code Online (Sandbox Code Playgroud)
在新的R会议中,结果是
> MyRPackage:::variable
[1] 42
Run Code Online (Sandbox Code Playgroud)
来自Hadley Wickham的高级R:
有四种特殊环境:
...
- environment()是当前环境.
...
您可以使用ls()列出环境框架中的绑定,并使用parent.env()查看其父级.
所以,如果我们.onLoad()进一步修改函数,我们可以看到这个:
.onLoad <- function(libname, pkgname) {
print(environment()) # For demonstration purposes only;
print(parent.env(environment())) # Don't really do this.
variable <- 42
assign("variable", variable, envir = parent.env(environment()))
}
Run Code Online (Sandbox Code Playgroud)
然后开始R会话结果
<environment: 0x483da88>
<environment: namespace:MyRPackage>
Run Code Online (Sandbox Code Playgroud)
在会话开始时打印到控制台.这允许您variable在环境中进行分配,namespace:MyRPackage即使尝试assign("variable", variable, envir = namespace:MyRPackage)会导致错误
错误:"MyRPackage"的包或命名空间加载失败:
.onLoad在'MyRPackage'的loadNamespace()中失败,详细信息:
call:get(name,envir = ns,inherits = FALSE)
错误:找不到对象'名称空间'
安装包时.
基本上有三种方法,从最简单到最复杂:
\nns$name = valueassign(\xe2\x80\xa6, envir = topenv())assignInMyNamespace(\xe2\x80\xa6)尽管选项 3 似乎相当普遍,但它需要在多个位置编写更多代码,因为您\xe2\x80\x99 首先需要创建一个变量,然后才能通过以下方式覆盖它assignInMyNamespace():
myvar = NULL\n\n.onLoad = function (libname, pkgname) {\n assignInMyNamespace(\'myvar\', value)\n}\nRun Code Online (Sandbox Code Playgroud)\n未能预先声明变量将导致错误。
\n相比之下,assign完全能够创建一个之前未声明过的新变量。我们只需告诉 R 将变量分配到哪个环境中,该函数topenv()就提供了这一点。
.onLoad = function (libname, pkgname) {\n assign(\'myvar\', value, envir = topenv())\n}\nRun Code Online (Sandbox Code Playgroud)\n当然,如果我们定义一个命名空间对象并对其进行子集分配,则我们不需要\xe2\x80\x99t assign()(或):assignInMyNamespace()
.onLoad = function (libname, pkgname) {\n ns = topenv()\n ns$myvar = value\n}\nRun Code Online (Sandbox Code Playgroud)\n对于我自己的代码,我倾向于这个选项。
\n