r - 如何从 R 中检查 externalptr 是否为 NULL

标签 r swig

我正在使用 SWIG 生成包装器代码以从 R 语言中访问 C 代码。包装器代码使用 R externalptr 类型来保存对 C 指针的引用。在某些情况下,这些指针在 C 端为 NULL,在 R 中显示为 nil 值。在 R 端,在 externalptr 上调用 is.null()is.na() 都返回 FALSE。例如:

> val = librdf_query_results_get_binding_value(results, 2)
> val
An object of class "_p_librdf_node_s"
Slot "ref":
<pointer: (nil)>
> class(val@ref)
[1] "externalptr"
> is.null(val@ref)
[1] FALSE
> is.na(val@ref)
[1] FALSE

从上面的代码输出可以看出,ref槽中包含一个externalptr,为“nil”。我如何从 R 中确定 C 中的 this 指针为 NULL?

如果您想在上下文中查看代码,可以在 GitHub 中找到: https://github.com/ropensci/redland-bindings/blob/master/R/redland/inst/tests/test.redland_base.R#L40

最佳答案

上面的 C 解决方案是最优雅的,但编译器可能并不总是可用。不需要编译代码的解决方案可能是这样的:

identical(pointer, new("externalptr"))

但是,如果对象具有自定义属性,这将不起作用。如果是这种情况,您可以这样做:

isnull <- function(pointer){
  a <- attributes(pointer)
  attributes(pointer) <- NULL
  out <- identical(pointer, new("externalptr"))
  attributes(pointer) <- a
  return(out)
}

再次比 C 解决方案复杂一点,但可以在任何平台上以简单的脚本运行。

关于r - 如何从 R 中检查 externalptr 是否为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666614/

相关文章:

r - URL 书签 R Shiny

Python 和 C : Is it possible to mix Ctypes and Swig together?

python - 通过 SWIG : can't get void** parameters to hold their value 从 C 到 Python

java - Swig:将返回类型 std::string(binary) 转换为 java byte[]

android - 一个Java线程一次如何执行一个以上的 native 方法?

r - 仅当 df1 中的行 ID 值也存在于 df2 中时才追加行

python - PypeR 问题 "global name ' dump_stdout' 未定义”

r - 当列只有一个值(100%)时,apply() 和 table() 返回奇怪的列表

python - 为什么 SWIG 似乎会损坏成员类的内容?

根据R中的另一列删除重复日期