编辑:不,该线程无法回答我的问题。请参阅下面的其他编辑内容。
我正在尝试从R调用在C库中实现的函数。C函数的签名是
METIS_API(int) METIS_PartGraphKway(idx_t *nvtxs, idx_t *ncon, idx_t *xadj,
idx_t *adjncy, idx_t *vwgt, idx_t *vsize, idx_t *adjwgt,
idx_t *nparts, real_t *tpwgts, real_t *ubvec, idx_t *options,
idx_t *edgecut, idx_t *part);
此函数允许几个参数为NULL,这意味着计算将使用默认值。如何将空指针作为R中的值传递?我的R代码看起来像这样
libpath <- '/usr/lib/x86_64-linux-gnu/libmetis.so'
dyn.load(libpath)
METIS_PartGraphKway <- function(xadj, adjncy, nparts) {
nvtxs <- length(xadj) - 1
ncon <- 1
.C('METIS_PartGraphKway', as.integer(nvtxs), as.integer(ncon),
as.integer(xadj), as.integer(adjncy), NULL, NULL, NULL,
as.integer(nparts), NULL, NULL, NULL, objval=integer(1),
part=integer(nvtxs))
}
xadj <- 0:4
adjncy <- c(1, 0, 3, 2)
METIS_PartGraphKway(xadj, adjncy, 2)
但是它给出了错误
Error in METIS_PartGraphKway(xadj, adjncy, 2) :
invalid mode (NULL) to pass to C or Fortran (arg 5)
在手册Writing R extensions中找不到对此的任何提及。如果可能的话,我想避免向函数编写C包装程序,因此不能使用备用.Call
外部函数接口。
编辑:This answer建议使用as.raw(rep(0, 4))
创建NULL指针,但它似乎对我不起作用。我不再遇到错误,但是计算的行为变得不稳定(随机且不等于使用C中相同的参数调用时),因此它似乎不是解决方案。我也尝试过as.raw(rep(0, 8))
,但还是没有成功。