是否可以列出所有可以通过 .Call() 加载的可用名称? .Call("function") 出错

Is it possible to list all available names which could be loaded via `.Call()`? Error in .Call("function")

Whosebug 上关于 C++/R 或 C/R 包集成的一个非常常见的问题是关于 dyn.load() 中的错误,例如

> ## within R
> Error in .Call("function_c") : C symbol name "function_c" not in load table

其中 function_c 是 C 中的某个函数,例如

SEXP function_c() {
  Rprintf("Hello World!\n"); // manually changed
  return(R_NilValue);
}

出现此错误的原因有很多种,例如编译不正确,函数命名错误,用户没有使用 extern "C" Cpp 代码等。

问题:有没有办法查看编译后用户可以通过dyn.load()加载的所有"available"对象?

下面的怎么样?我不确定它涵盖了 所有内容,但应该接近:

# manipulate search() to get all loaded packages
loadedPkgs = grep('^package:', search(), value = TRUE)
loadedPkgs = gsub('package:', '', loadedPkgs, fixed = TRUE)
# add names here to make the results of lapply pretty
names(loadedPkgs) = loadedPkgs

allCRoutines = lapply(loadedPkgs, function(pkg) {
  # see: 
  pkg_env = asNamespace(pkg)
  # this works at a glance
  check_CRoutine = function(vname) {
    'CallRoutine' %in% attr(get(vname, envir = pkg_env), 'class')
  }
  names(which(sapply(ls(envir = pkg_env, all = TRUE), check_CRoutine)))
})

对象有点长,所以我只展示一个包裹:

allCRoutines[['utils']]
# $utils
#  [1] "C_crc64"         "C_flushconsole"  "C_menu"          "C_nsl"           "C_objectSize"    "C_octsize"       "C_processevents"
#  [8] "C_sockclose"     "C_sockconnect"   "C_socklisten"    "C_sockopen"      "C_sockread"      "C_sockwrite"  

我不确定的是 check_CRoutine 捕获了我们认为与您的问题相关的所有内容。我也不确定这是否涵盖了您的主要兴趣(这些对象是否可以成功地提供给 dyn.load);也许这里返回的例程可以通过 try 包装器传递给 dyn.load