使用 Emscripten 将 R 函数编译为 JavaScript
Posted
技术标签:
【中文标题】使用 Emscripten 将 R 函数编译为 JavaScript【英文标题】:Compiling R functions to JavaScript with Emscripten 【发布时间】:2015-02-17 23:37:09 【问题描述】:我正在尝试使用 Emscripten 将一些用 C 编写的 R 函数编译为 javascript。我的第一个任务是移植一个名为 pf
的函数。
来源可以在here找到。所以,我进入 src 目录并尝试运行:
(trunk)⚡ % emcc -s EXPORTED_FUNCTIONS="['_Rf_pf']" nmath/pf.c
warning: unresolved symbol: Rf_pbeta
warning: unresolved symbol: Rf_pchisq
warning: unresolved symbol: R_NaN
warning: unresolved symbol: R_NegInf
warning: unresolved symbol: R_PosInf
我在输出 JavaScript 中得到一个函数 _Rf_pf
。我实际上可以调用这个函数并返回一个结果。但是,由于R_PosInf
和公司没有解决,它在R_P_bounds_01(x, 0., ML_POSINF);
上短路。 ML_POSINF
以某种方式设置为 0 给出奇怪的结果。所以,算法的核心并没有被执行。
有谁知道如何解决这些符号并移植此功能?
我可以尝试编译更多源代码,这似乎让我有所收获:
$ emcc -s EXPORTED_FUNCTIONS="['_Rf_pf']" nmath/pf.c nmath/pbeta.c nmath/pchisq.c
warning: unresolved symbol: R_finite
warning: unresolved symbol: Rf_pgamma
warning: unresolved symbol: Rf_warning
warning: unresolved symbol: bratio
warning: unresolved symbol: gettext
warning: unresolved symbol: R_NaN
warning: unresolved symbol: R_NegInf
warning: unresolved symbol: R_PosInf
但是,这似乎将我引向了一个巨大的兔子洞。然后,我遇到了一些障碍:
$ emcc -s EXPORTED_FUNCTIONS="['_Rf_pf']" nmath/pf.c nmath/pbeta.c nmath/pchisq.c main/arithmetic.c
In file included from main/arithmetic.c:35:
include/Defn.h:201:3: error: SIZE_MAX is required for C99
# error SIZE_MAX is required for C99
^
include/Defn.h:639:9: error: unknown type name 'R_size_t'
extern0 R_size_t R_NSize INI_as(R_NSIZE);/* Size of cons cell heap */
^
include/Defn.h:640:9: error: unknown type name 'R_size_t'
extern0 R_size_t R_VSize INI_as(R_VSIZE);/* Size of the vector heap */
^
...
fatal error: too many errors emitted, stopping now [-ferror-limit=]
请注意,我设置了 CPATH。我不知道这是否是将编译器指向我需要的不同标头的方法:
(trunk)⚡ % echo $CPATH
gnuwin32/fixed/h/:/usr/local/Cellar/r/3.1.2_1/include/:/usr/local/Cellar/r/3.1.2_1/R.framework/Versions/3.1/Resources/include/:nmath/:include/:main/:include/R_ext
【问题讨论】:
【参考方案1】:如果要使用gnuwin32/fixed/h/config.h
,则需要-DHAVE_CONFIG_H
。
https://github.com/wch/r-source/blob/trunk/src/gnuwin32/Makefile
【讨论】:
谢谢,很好的信息。但是,它并没有多大帮助。我从运行./configure
得到了一个非 Windows config.h,我现在将它包含在 -DHAVE_CONFIG_H 中,但问题仍然存在。以上是关于使用 Emscripten 将 R 函数编译为 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
使用 emscripten 将 c++ 代码编译为 javascript 以求两个数之和。练习
如何使用 Emscripten 将 Hello Word 从 Swift 编译为 JavaScript
在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript
Emscripten 中的“Module”变量机制,同时将 Pthread 编译为 worker