是否可以列出所有可以通过 .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
?
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
?