加载包中的函数没有出现在搜索路径中
function in loaded package doesn't appear in search path
我有一个已发布的包 cgwtools
,其中包含 !
运算符的重载。这是源文件中的代码 splatnd.r
:
`!` <- function (e1, e2)
{
call <- match.call()
original <- function() {
call[[1]] <- quote(base::`!`)
return(eval(call, parent.frame(2)))
}
switch(paste(as.character(call[[2]]), sep = "", collapse = ""),
newdev = dev.new(width = 4.5, height = 4.5, restoreConsole = T),
qapla = cat("batlh tIn chav\n"), return(original()))
}
这是基于 sos
包中名为 ???
的简洁工具。如果我只是 source
!
代码,它会 运行 符合预期。过去,至少在 R 3.2.x
之前,加载包 cgwtools
让我 运行 !
符合预期。我最近在一台 Windows 7 机器上设置了 3.2.4 和 3.3.1 版本,但出现奇怪的明显加载失败。这是一些控制台文本,显示加载前后的搜索路径 cgwtools
> getAnywhere(`!`)
A single object matching ‘!’ was found
It was found in the following places
package:base
namespace:base
with value
function (x) .Primitive("!")
> library(cgwtools)
> getAnywhere(`!`)
2 differing objects matching ‘!’ were found
in the following places
package:base
namespace:cgwtools
namespace:base
通过比较,对 sos
包做同样的事情 returns 我期望的是:
> getAnywhere(`?`)
2 differing objects matching ‘?’ were found
in the following places
package:sos
package:utils
namespace:utils
namespace:sos
如果我访问输出,则会显示正确的源代码:
> getAnywhere(`!`)[2]
function (e1, e2)
{
call <- match.call()
original <- function() {
call[[1]] <- quote(base::`!`)
return(eval(call, parent.frame(2)))
}
switch(paste(as.character(call[[2]]), sep = "", collapse = ""),
newdev = dev.new(width = 4.5, height = 4.5, restoreConsole = T),
qapla = cat("batlh tIn chav\n"), return(original()))
}
<environment: namespace:cgwtools>
但是,如缺少文本 package:cgwtools
所示,当我尝试 运行,从 gui 控制台说 !qapla
时,我收到错误消息 qapla
未找到,即调用了 .Primitive
运算符 !
。
那么问题来了:为什么cgwtools
包中的!
函数加载包后无法识别?我是不是在构建包源代码时做了一些愚蠢的事情,还是我在 CRAN 构建器中发现了一些错误?
子问题:我无法找出不会导致解析错误的定向命令 cgwtools::
'!'qapla
的任何变体。
编辑
回应alexis_laz的查询:
> search()
[1] ".GlobalEnv" "package:cgwtools" "package:stats"
[4] "package:graphics" "package:datasets" "package:grDevices"
[7] "package:lattice" "package:sos" "package:brew"
[10] "package:utils" "package:methods" "Autoloads"
[13] "package:base"
> cgwtools:::'!'qapla
Error: unexpected symbol in "cgwtools:::'!'qapla"
并且,
> get('!')(qapla)
Error: object 'qapla' not found
> get('!',2)(qapla)
Error: object 'qapla' not found
再次建议“!”没有从 cgwtools
导出。
另请注意——有关从
返回的项目,请参见上文
getAnywhere(`!`)
我可以拉取代码:
> getAnywhere(`!`)[2](qapla)
batlh tIn chav
感谢@alexis_laz 的建议,我回去查看了 package.skeleton
生成的默认 NAMESPACE
文件。该文件包含行
exportPattern("^[[:alpha:]]+")
显然,我需要向该文件中添加明确的 export('!')
行。 (加上根据最近的 CRAN 要求对显式 import
的 base
包的新要求,但这是一个单独的问题)
编辑
对于没有经验的人(比如我),请注意,更改 NAMESPACE
文件后,必须重新构建包。编辑所述文件不足。
我有一个已发布的包 cgwtools
,其中包含 !
运算符的重载。这是源文件中的代码 splatnd.r
:
`!` <- function (e1, e2)
{
call <- match.call()
original <- function() {
call[[1]] <- quote(base::`!`)
return(eval(call, parent.frame(2)))
}
switch(paste(as.character(call[[2]]), sep = "", collapse = ""),
newdev = dev.new(width = 4.5, height = 4.5, restoreConsole = T),
qapla = cat("batlh tIn chav\n"), return(original()))
}
这是基于 sos
包中名为 ???
的简洁工具。如果我只是 source
!
代码,它会 运行 符合预期。过去,至少在 R 3.2.x
之前,加载包 cgwtools
让我 运行 !
符合预期。我最近在一台 Windows 7 机器上设置了 3.2.4 和 3.3.1 版本,但出现奇怪的明显加载失败。这是一些控制台文本,显示加载前后的搜索路径 cgwtools
> getAnywhere(`!`)
A single object matching ‘!’ was found
It was found in the following places
package:base
namespace:base
with value
function (x) .Primitive("!")
> library(cgwtools)
> getAnywhere(`!`)
2 differing objects matching ‘!’ were found
in the following places
package:base
namespace:cgwtools
namespace:base
通过比较,对 sos
包做同样的事情 returns 我期望的是:
> getAnywhere(`?`)
2 differing objects matching ‘?’ were found
in the following places
package:sos
package:utils
namespace:utils
namespace:sos
如果我访问输出,则会显示正确的源代码:
> getAnywhere(`!`)[2]
function (e1, e2)
{
call <- match.call()
original <- function() {
call[[1]] <- quote(base::`!`)
return(eval(call, parent.frame(2)))
}
switch(paste(as.character(call[[2]]), sep = "", collapse = ""),
newdev = dev.new(width = 4.5, height = 4.5, restoreConsole = T),
qapla = cat("batlh tIn chav\n"), return(original()))
}
<environment: namespace:cgwtools>
但是,如缺少文本 package:cgwtools
所示,当我尝试 运行,从 gui 控制台说 !qapla
时,我收到错误消息 qapla
未找到,即调用了 .Primitive
运算符 !
。
那么问题来了:为什么cgwtools
包中的!
函数加载包后无法识别?我是不是在构建包源代码时做了一些愚蠢的事情,还是我在 CRAN 构建器中发现了一些错误?
子问题:我无法找出不会导致解析错误的定向命令 cgwtools::
'!'qapla
的任何变体。
编辑
回应alexis_laz的查询:
> search()
[1] ".GlobalEnv" "package:cgwtools" "package:stats"
[4] "package:graphics" "package:datasets" "package:grDevices"
[7] "package:lattice" "package:sos" "package:brew"
[10] "package:utils" "package:methods" "Autoloads"
[13] "package:base"
> cgwtools:::'!'qapla
Error: unexpected symbol in "cgwtools:::'!'qapla"
并且,
> get('!')(qapla)
Error: object 'qapla' not found
> get('!',2)(qapla)
Error: object 'qapla' not found
再次建议“!”没有从 cgwtools
导出。
另请注意——有关从
getAnywhere(`!`)
我可以拉取代码:
> getAnywhere(`!`)[2](qapla)
batlh tIn chav
感谢@alexis_laz 的建议,我回去查看了 package.skeleton
生成的默认 NAMESPACE
文件。该文件包含行
exportPattern("^[[:alpha:]]+")
显然,我需要向该文件中添加明确的 export('!')
行。 (加上根据最近的 CRAN 要求对显式 import
的 base
包的新要求,但这是一个单独的问题)
编辑
对于没有经验的人(比如我),请注意,更改 NAMESPACE
文件后,必须重新构建包。编辑所述文件不足。