关于C ++ / R或C / R软件包集成,关于StackOverflow的一个非常常见的问题是关于中的错误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()
在编译后可以通过其加载的所有“可用”对象?
接下来呢?我不确定它是否涵盖了所有内容,但应该接近:
# 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: https://stackoverflow.com/questions/8696158/
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
);也许这里返回的例程可以通过包装器传递给dyn.load
它try
?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句