使用.C

时间:2019-02-20 09:13:54

标签: c r ffi

编辑:不,该线程无法回答我的问题。请参阅下面的其他编辑内容。

我正在尝试从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)),但还是没有成功。

0 个答案:

没有答案