## within R > Error in .Call("fu-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:57 24 4
gpt4 key购买 nike

StackOverflow 上关于 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()加载的所有“可用”对象?

最佳答案

下面的呢?我不确定它涵盖了一切,但应该很接近:

# 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);也许这里返回的例程可以通过 try 包装器传递给 dyn.load

关于c++ - 是否可以列出所有可以通过 `.Call()` 加载的可用名称? .Call ("function"错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com