Эта проблема, которую я разместил здесь, на самом деле связана с конфигурацией серверов. Пакет на самом деле не имеет проблем, связанных с 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.
Rcpp
? Это делает весь этот экспорт C-функций намного проще. - person cdeterman   schedule 17.03.2015f1()
иf2()
в отдельные сценарии и использую.export = c("f1", "f2")
вforeach
, пакет также дает сбой в Linux, выдавая сообщение об ошибке: Ошибка в {: задача 1 не выполнена - не смог найти функцию f1 - person Han Zhang   schedule 17.03.2015f1
иf2
вне телаf3
. Также не используйте.export = c("f1", "f2")
в циклеforeach
. Скажи мне, работает ли это. Недавно у меня была похожая проблема: /а> - person cryo111   schedule 18.03.2015f1
иf2
определены в одном или другом скрипте, содержащемf3
, независимо от того, вызывается строкаtmp <- .C("foo")
или нет. Под Linux: пробовал разные комбинации: (1)f1
иf2
определяются в одном или отдельном скриптеf3
; (2) строка `tmp ‹- .C(foo) закомментирована или нет. Я всегда получал сообщение об ошибке: не удалось найти функцию f2 - person Han Zhang   schedule 18.03.2015Linux 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