如何检查 R 中的 externalptr 是否为 NULL

met*_*ttj 2 swig r

我使用 SWIG 生成包装器代码以从 R 语言中访问 C 代码。包装器代码使用 Rexternalptr类型来保存对 C 指针的引用。在某些情况下,这些指针在 C 端为 NULL,在 R 中显示时显示为 nil 值。在 R 端,调用is.null()is.na()externalptr返回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
Run Code Online (Sandbox Code Playgroud)

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

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

Jer*_*oen 6

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

identical(pointer, new("externalptr"))
Run Code Online (Sandbox Code Playgroud)

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

isnull <- function(pointer){
  a <- attributes(pointer)
  attributes(pointer) <- NULL
  out <- identical(pointer, new("externalptr"))
  attributes(pointer) <- a
  return(out)
}
Run Code Online (Sandbox Code Playgroud)

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