Fortran 代码并发现没有调用:'R_registerRoutines'、'R_useDynamicSymbols'
Fortran code and Found no calls to: 'R_registerRoutines', 'R_useDynamicSymbols'
当我将我的包裹提交给 cran 时,出现如下错误
发现没有调用:'R_registerRoutines'、'R_useDynamicSymbols'
注册本机例程并禁用符号是一种很好的做法
搜索。
我的包由 CRAN 在这个版本的 R 中测试:
R 版本 3.4.0 alpha (2017-03-28 r72427)
注意这里有这个错误的解决方法
但我的外部代码在 Fortran 中并尝试了那里描述的过程但没有为我解决问题。我能做些什么来克服这个问题?
谢谢
更新:
按照描述的程序 https://www.r-bloggers.com/1-easy-package-registration/ 我可以通过
Error:Found no calls to: ‘R_useDynamicSymbols’
但是Found no call to: 'R_registerRoutines'
仍然存在。
我解决了这个问题,您可能会发现它对您自己的情况有用。
假设您在 src 目录中有一个名为 myf.f90 的子程序,其内容如下:
SUBROUTINE cf(r,cd,loci)
INTEGER::r,cd
DOUBLE PRECISION::loci
....
....
....
END SUBROUTINE cf
要注册,您需要执行以下操作:
A) 运行 tools::package_native_routine_registration_skeleton("package directory")
B) 编辑输出;对于上面的例子将是:
#include <R.h>
#include <Rinternals.h>
#include <stdlib.h> // for NULL
#include <R_ext/Rdynload.h>
/* FIXME:
Check these declarations against the C/Fortran source code.
*/
/* .Fortran calls */
extern void F77_NAME(cf)(int *r, int *cd, double *loci);
static const R_FortranMethodDef FortranEntries[] = {
{"cf", (DL_FUNC) &F77_NAME(cf), 3},
{NULL, NULL, 0}
};
void R_init_packagename(DllInfo *dll)
{
R_registerRoutines(dll, NULL, NULL, FortranEntries, NULL);
R_useDynamicSymbols(dll, FALSE);
}
C) 将完整的输出复制并粘贴到要放入 src/
的 packagename_init.c 文件中
D) 更新 NAMESPACE,验证 useDynLib(packagename, .registration = TRUE)
当我将我的包裹提交给 cran 时,出现如下错误 发现没有调用:'R_registerRoutines'、'R_useDynamicSymbols' 注册本机例程并禁用符号是一种很好的做法 搜索。 我的包由 CRAN 在这个版本的 R 中测试:
R 版本 3.4.0 alpha (2017-03-28 r72427)
注意这里有这个错误的解决方法
更新: 按照描述的程序 https://www.r-bloggers.com/1-easy-package-registration/ 我可以通过
Error:Found no calls to: ‘R_useDynamicSymbols’
但是Found no call to: 'R_registerRoutines'
仍然存在。
我解决了这个问题,您可能会发现它对您自己的情况有用。 假设您在 src 目录中有一个名为 myf.f90 的子程序,其内容如下:
SUBROUTINE cf(r,cd,loci)
INTEGER::r,cd
DOUBLE PRECISION::loci
....
....
....
END SUBROUTINE cf
要注册,您需要执行以下操作:
A) 运行 tools::package_native_routine_registration_skeleton("package directory")
B) 编辑输出;对于上面的例子将是:
#include <R.h>
#include <Rinternals.h>
#include <stdlib.h> // for NULL
#include <R_ext/Rdynload.h>
/* FIXME:
Check these declarations against the C/Fortran source code.
*/
/* .Fortran calls */
extern void F77_NAME(cf)(int *r, int *cd, double *loci);
static const R_FortranMethodDef FortranEntries[] = {
{"cf", (DL_FUNC) &F77_NAME(cf), 3},
{NULL, NULL, 0}
};
void R_init_packagename(DllInfo *dll)
{
R_registerRoutines(dll, NULL, NULL, FortranEntries, NULL);
R_useDynamicSymbols(dll, FALSE);
}
C) 将完整的输出复制并粘贴到要放入 src/
的 packagename_init.c 文件中D) 更新 NAMESPACE,验证 useDynLib(packagename, .registration = TRUE)