加载包中的函数没有出现在搜索路径中

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 要求对显式 importbase 包的新要求,但这是一个单独的问题)

编辑

对于没有经验的人(比如我),请注意,更改 NAMESPACE 文件后,必须重新构建包。编辑所述文件不足。