Rcpp初学者的问题:
我想提高我在R中的执行效率。所以我在cpp中编写了一些代码并使用Rcpp来帮助我编译它们。
问题是我在.cpp文件中使用了一些其他R包,我希望在用户安装我的包时自动安装和导入这些包。
e.g。如果我在我的文件中使用R包'gtools',我不想要错误:
* installing to library 'C:/Program Files/R/R-3.4.1/library'
* installing *source* package 'pkgname' ...
make: Nothing to be done for `all`.
** libs
installing to C:/Program Files/R/R-3.4.1/library/pkgname/libs/i386
** R
** preparing package for lazy loading
Error in library(gtools) : there is no package called 'gtools'
Error : unable to load R code in package 'pkgname'
ERROR: lazy loading failed for package 'pkgname'
* removing 'C:/Program Files/R/R-3.4.1/library/pkgname'
Exited with status 1.
我尝试将依赖的包名称添加到 DESCRIPTION 文件中。即。
Imports: Rcpp (>= 0.12.12),gtools
LinkingTo: Rcpp, gtools
但它给了我以下错误:
ERROR: dependency 'gtools' is not available for package 'pkgname'
我没有找到任何类似的问题,请告诉我是否有。
答案 0 :(得分:3)
首先,您应该确保在系统上安装了gtools
。我这样说是因为以下错误:
库中的错误(gtools):没有名为'gtools'的包
说到这里,您遇到的主要问题是LinkingTo:
文件中Imports:
和DESCRIPTION
字段之间的不确定性。 Section 1.1.3: Package Dependencies Writing R Extensions BH
中介绍了这一点。
具体来说,我们有:
‘Imports’
字段列出从其导入名称空间的包(如NAMESPACE
文件中所指定)但不需要附加的包。‘::’
和‘:::’
运算符访问的命名空间必须在此处列出,或在‘Suggests’
或‘Enhances’
中列出(见下文)。理想情况下,此字段将包含所有使用的标准包,并且包含使用S4的包很重要(因为它们的类定义可以更改,并且DESCRIPTION
文件用于决定在此时重新安装哪些包发生)。在‘Depends’
字段中声明的包不应位于‘Imports’
字段中。可以指定版本要求,并在加载命名空间时检查(因为R> = 3.0.0)。
LinkingTo
字段:
希望在其他包中使用头文件的包需要 将它们声明为逗号分隔的列表,在字段
‘LinkingTo’
中DESCRIPTION
个文件。例如LinkingTo: link1, link2
‘LinkingTo’
字段可以具有在安装时检查的版本要求。如果包含源代码或静态链接的C ++标题在安装时完成,则在'LinkingTo'中指定一个包就足够了:这些包不需要(通常不应该)列在'Depends'或{{ 1}}字段。这包括CRAN包
RcppArmadillo
以及RcppEigen
和Linking to native routines in other packages的几乎所有用户。
‘Imports’
的另一种用途,请参见native methods。
因此, ‘LinkingTo’
旨在指定包含您要导入的 R 函数的包。特别是,必须在Imports:
文件中指定给定包的功能或整个包本身。对于使用 Rcpp 的软件包,如果作者已从C ++导出例程,通常可以期望 R 函数可用。
现在,关于 NAMESPACE
,这有点具体。如果作者希望通过头文件提供 C ++ API,则必须在Writing R Extensions的 Section 5.8: Linking to other packages 中明确声明这些语句。通常,以这种方式进行的包是“仅标题”。这些包将标题定义放在LinkingTo:
下,例如
inst/include
然而,另一个趋势是允许“非标头”包。由于您必须了解共享对象和动态库,因此这会导致更复杂的主题。 CRAN概述<{3}} Writing R Extensions
中如何“链接”软件包如果作者不提供C ++ API,则有四个选项:
不幸的是,|- pkgname
|- inst/
|- include/
|- pkgname.h
|- R/
|- man/
|- DESCRIPTION
|- NAMESPACE
就属于这种情况。作为作者do not provide a means to "link" to the C++ version of package's code。