РЕДАКТИРОВАТЬ: Нет, эта тема не отвечает на мой вопрос.См. Мое другое редактирование ниже.
Я пытаюсь вызвать функцию, реализованную в библиотеке C, из R. Подпись функции 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);
Эта функция допускает несколько аргументовбыть НЕДЕЙСТВИТЕЛЬНЫМ, означая, что вычисление будет использовать значения по умолчанию.Как я могу передать нулевой указатель как значение из 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)
Я не могу найти упоминаний об этом в руководстве Написание расширений R .Если возможно, я хочу избежать записи обертки C в функцию и, следовательно, не могу использовать альтернативный интерфейс внешней функции .Call
.
EDIT: Этот ответ предлагает использовать as.raw(rep(0, 4))
длясоздать указатель NULL, но он не работает для меня.Я больше не получаю ошибку, но поведение вычисления становится ошибочным (случайным и не равным тому, когда вызывается с теми же аргументами из C), так что это не кажется решением.Я тоже пробовал с as.raw(rep(0, 8))
, но все равно безуспешно.