Имя символа C отсутствует в таблице загрузки при экспорте функции в цикле foreach

Эта проблема, которую я разместил здесь, на самом деле связана с конфигурацией серверов. Пакет на самом деле не имеет проблем, связанных с R/C.

Я разрабатываю пакет R, используя foreach для ускорения вычислений. Чтобы проиллюстрировать структуру пакета, ниже я привожу упрощенный R-скрипт и C-файл:

f3.R:

f3 = function(.lst){
  cl <- makeCluster(2)
  registerDoParallel(cl)
  
  f1 <-function(x){
    tmp <- .C("foo")
    x
  }
  
  f2 <-function(x){
    f1(x)
  }
  
  foreach(x=.lst, .verbose = TRUE ) %dopar% {
  f2(x)
  
  }
}

foo.c

#include <stdio.h> 
#include <R.h> 

extern "C" {
  void foo() {
    ;
  }
}

Этот пакет очень хорошо работает на Mac OS, но выдает сообщение об ошибке

автоматический экспорт следующих переменных из локальной среды: f1, f2

numValues: 1, numResults: 0, остановлено: TRUE

получил результаты по заданию 1

аккумулировать получил результат ошибки

numValues: 1, numResults: 1, остановлено: TRUE

не вызывать функцию объединения из-за ошибок

возвращаемый статус ИСТИНА

Ошибка в {: задача 1 не удалась - имя символа C foo отсутствует в таблице загрузки

Вот что я пробовал:

  • добавить .export = c("foo"): не помогает
  • переместите f1() и f2() в отдельный скрипт R и добавьте .export = c("f1", "f2"): работает и в Mac OS, но не помогает в linux
  • если я не собираю пакет, а загружаю функции выше в память напрямую, то это работает как на Mac OS, так и на Linux
  • если функция C не вызывается (обратите внимание, что в моем примере код C ничего не делал), то он работает как в Mac OS, так и в Linux. Однако, если я перенесу f1() и f2() в отдельные R-скрипты и добавлю .export = c("f1", "f2"), в Linux снова произойдет сбой.

В большинстве сообщений, найденных в Интернете, предлагалось использовать .export для экспорта функций R, но я ничего не нашел об экспорте символов C.


person Han Zhang    schedule 17.03.2015    source источник
comment
Есть ли причина, по которой вы не используете Rcpp? Это делает весь этот экспорт C-функций намного проще.   -  person cdeterman    schedule 17.03.2015
comment
Я поддерживаю старый пакет, в котором коды c были разработаны несколько лет назад другими людьми. У нас есть план распараллелить его. Нелегко преобразовать их всех в Rcpp. Я все равно попробую Rcpp в своих новых пакетах (спасибо за предложение). Есть предложения по текущему вопросу?   -  person Han Zhang    schedule 17.03.2015
comment
@cdeterman Даже если я не вызываю код c в пакете, когда я перемещаю f1() и f2() в отдельные сценарии и использую .export = c("f1", "f2") в foreach, пакет также дает сбой в Linux, выдавая сообщение об ошибке: Ошибка в {: задача 1 не выполнена - не смог найти функцию f1   -  person Han Zhang    schedule 17.03.2015
comment
Если возможно, попробуйте определить функции f1 и f2 вне тела f3. Также не используйте .export = c("f1", "f2") в цикле foreach. Скажи мне, работает ли это. Недавно у меня была похожая проблема: /а>   -  person cryo111    schedule 18.03.2015
comment
@ cryo111 В Mac OS: хорошо работает, если f1 и f2 определены в одном или другом скрипте, содержащем f3, независимо от того, вызывается строка tmp <- .C("foo") или нет. Под Linux: пробовал разные комбинации: (1) f1 и f2 определяются в одном или отдельном скрипте f3; (2) строка `tmp ‹- .C(foo) закомментирована или нет. Я всегда получал сообщение об ошибке: не удалось найти функцию f2   -  person Han Zhang    schedule 18.03.2015
comment
@HanZhang, у тебя случайно нет этого пакета на github? Я только что создал пакет, содержащий эти функции в системе Ubuntu, и он работает без проблем. Было бы проще всего увидеть, какова структура вашего пакета, что может привести к потере вещей. Мой рабочий пакет Linux находится на моем github здесь   -  person cdeterman    schedule 18.03.2015
comment
@cdeterman Спасибо за загрузку пакета. Я разместил свой пакет на github. Но прежде чем сделать это, я загружаю ваш и тестирую его на двух серверах Linux, и он тоже не работает. Оба сервера выдают одно и то же сообщение об ошибке: Ошибка в {: задача 1 не удалась - имя символа C foo отсутствует в таблице загрузки. Возможно, мне нужно связаться с администратором, чтобы выяснить, вызывает ли эта проблема конфигурацию сервера или нет.   -  person Han Zhang    schedule 18.03.2015
comment
@HanZhang, каковы конкретные архитектуры этих серверов (например, CentOS, Ubuntu и т. д., а также номер версии, например 6.5 или 14.04). Я могу запустить несколько виртуальных машин, чтобы попробовать и протестировать их дальше.   -  person cdeterman    schedule 18.03.2015
comment
@cdeterman это выпуск CentOS 5 (финальный), а uname -a дает Linux p2561 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux   -  person Han Zhang    schedule 18.03.2015
comment
@cdeterman Один из моих друзей протестировал мой пакет на своем Linux Centos 6.6, и пакет прошел хорошо. Мне нужно связаться с администратором, чтобы найти решение. Спасибо   -  person Han Zhang    schedule 18.03.2015


Ответы (1)


Я решил проблему, создав пакет со всеми функциями с расширением .C. Затем вы добавляете .packages = yourpackage и экспортируете все необходимые функции.

person Bruno Remillard    schedule 03.09.2020
comment
Добро пожаловать в Stack Overflow! Вот руководство по Как ответить. - person help-info.de; 04.09.2020