我正在使用SWIG生成包装程序代码,以从R语言中访问C代码。包装器代码使用R externalptr类型保存对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

从上面的代码输出中可以看出,ref插槽包含一个externalptr,它为“nil”。如何从R中确定C中的此指针为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/

10-11 00:51