Передать нулевой указатель на C из R, используя .C - PullRequest
0 голосов
/ 20 февраля 2019

РЕДАКТИРОВАТЬ: Нет, эта тема не отвечает на мой вопрос.См. Мое другое редактирование ниже.

Я пытаюсь вызвать функцию, реализованную в библиотеке 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)), но все равно безуспешно.

...