调用Rcpp c++;来自同一包中的R代码的函数 我想用C++和R代码构建一个RCPP包。使用C++代码(R代码被删除),所有的编译和工作都很好,在构建和加载导出函数后,可以按照的方式调用。 <packageName>::<functionName>()

调用Rcpp c++;来自同一包中的R代码的函数 我想用C++和R代码构建一个RCPP包。使用C++代码(R代码被删除),所有的编译和工作都很好,在构建和加载导出函数后,可以按照的方式调用。 <packageName>::<functionName>(),r,rcpp,r-package,R,Rcpp,R Package,其中编译包时会生成.o和.so文件 R文件直接从C++文件调用函数: [other stuff] [...] <functionName>() 这似乎是一个非常简单且直接的问题(从RCPP包中的R代码调用C++代码)。然而,我似乎找不到任何迹象表明应该如何做到这一点 编辑(2020年4月8日):构建与安装 这一问题在任何情况下都会发生 R CMD INSTALL <packageName>_<version>.tar.gz 如上所述 编辑(2020年4月

其中编译包时会生成
.o
.so
文件

R文件直接从C++文件调用函数:

[other stuff]
[...]
<functionName>()

这似乎是一个非常简单且直接的问题(从RCPP包中的R代码调用C++代码)。然而,我似乎找不到任何迹象表明应该如何做到这一点

编辑(2020年4月8日):
构建
安装

这一问题在任何情况下都会发生

R CMD INSTALL <packageName>_<version>.tar.gz
如上所述

编辑(2020年4月8日):使用
Rcpp.package.skeleton()
复制的步骤(无论如何,在类Unix系统上)


你可能想放慢脚步。Rcpp包本身通过
Rcpp.package.skeleton()
函数附带了一个演示包生成器。快跑

将一件一件地与你所拥有的进行比较

第二个生成器内置于RStudio中,可在文件->新项目->新目录->带有Rcpp菜单选项的软件包下使用

否则,很难说。你对你的函数名做了什么奇怪的事吗?因为这些映射到R和C++,所以两者都有限制。也就是说,不能使用点(因为在C++中,点是类方法表示法)

最后,即使未导出,也可以通过三个冒号从安装和加载的包中获得C++函数,即<代码> MyPKK::MyFun.()/< > > /P> 最后,快速演示:

创建它
edd@rob:/tmp$ Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")'
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Saving functions and data ...
Making help files ...
Done.
Further steps are described in './demo20200408/Read-and-delete-me'.

Adding Rcpp settings
 >> added Imports: Rcpp
 >> added LinkingTo: Rcpp
 >> added useDynLib directive to NAMESPACE
 >> added importFrom(Rcpp, evalCpp) directive to NAMESPACE
 >> added example src file using Rcpp attributes
 >> added Rd file for rcpp_hello_world
 >> compiled Rcpp attributes 
edd@rob:/tmp$ 
安装它
edd@rob:/tmp$ R CMD INSTALL demo20200408 
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘demo20200408’ ...
** using staged installation
** libs
ccache g++ -I"/usr/share/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O3 -Wall -pipe -pedantic  -c RcppExports.cpp -o RcppExports.o
ccache g++ -I"/usr/share/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O3 -Wall -pipe -pedantic  -c rcpp_hello_world.cpp -o rcpp_hello_world.o
ccache g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o demo20200408.so RcppExports.o rcpp_hello_world.o -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (demo20200408)
edd@rob:/tmp$ 
运行它
edd@rob:/tmp$ Rscript -e 'library(demo20200408); rcpp_hello_world()'
[[1]]
[1] "foo" "bar"

[[2]]
[1] 0 1

edd@rob:/tmp$ 
并添加一个R函数并调用它
edd@rob:/tmp$ echo 'r_hello_world <- function() cat("hi there\n")' > demo20200408/R/foo.R
edd@rob:/tmp$ R CMD INSTALL demo20200408 
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘demo20200408’ ...
** using staged installation
** libs
make: Nothing to be done for 'all'.
installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (demo20200408)
edd@rob:/tmp$ Rscript -e 'library(demo20200408); r_hello_world()'
hi there
edd@rob:/tmp$ 

edd@rob:/tmp$echo'r\u你好,谢谢。就我所见,
Rcpp.package.skeleton()
构建了一个包,除了
RcppExports.R
之外,没有任何R代码。正如我所说,这一部分对我也很有用。问题出在R代码中。我从来没有这样使用过它,但如果您阅读了
package.skeleton()
(我们称之为)的(可用)帮助,您将看到它显示了如何从现有R函数或文件创建骨架。除此之外,您还可以使用
cp
命令或编辑器将R文件添加到您的目录中,因此我不太清楚约束在哪里。谢谢。还感谢您添加带有R函数的示例。但是,如果您从R脚本调用
rcpp\u hello\u world()
(即使这是R脚本中的唯一一行),您的
R CMD INSTALL(packageName)\u(version).tar.gz
命令将如上所述失败。(注意:
R CMD build(packageName)
如果
man/packageName package.Rd
强制
安装程序包以处理帮助页面,也会失败;这是我在OP中描述的情况。)我无法重现(请参阅另一个编辑),我们正在兜圈子。你声称有些东西起作用了,我无法理解你的意思。无论如何,这不是错误报告的场所。GitHub,如果你有一个可复制的问题,也许你可以把它归档在那里。那么你是说代码必须放在R脚本中的一个函数中,这样当编译器读取脚本时它就不会被执行了?这对我来说很有意义。像这样的独立代码会做什么?你会得到什么样的结果?谁或者怎么称呼它?这毫无意义。软件包启动代码更容易理解,可以放在
.onLoad()
.onAttach()
中,当然也可以使用同一软件包中的Rcpp驱动代码。@DirkEddelbuettel:在下面对您答案的评论中解释:我必须让我的软件包在R代码中明确使用库。这个库用于我的C++函数中的<代码> @示例< /代码>。如果我没有在R代码中显式地使用它,而是将它包含在描述文件中,或者如果我根本没有将它包含在描述文件中,那么各种编译器都会抛出警告,这是我无法得到的。因此,我希望将示例代码作为R脚本包含在内。但你是对的,我认为它应该在函数中。
R CMD INSTALL <packageName>_<version>.tar.gz
man/<packageName>-package.Rd
R CMD build <packageName>
Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")'
echo 'rcpp_hello_world()' > errorDemo/R/example.R
R CMD INSTALL errorDemo
edd@rob:/tmp$ Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")'
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Saving functions and data ...
Making help files ...
Done.
Further steps are described in './demo20200408/Read-and-delete-me'.

Adding Rcpp settings
 >> added Imports: Rcpp
 >> added LinkingTo: Rcpp
 >> added useDynLib directive to NAMESPACE
 >> added importFrom(Rcpp, evalCpp) directive to NAMESPACE
 >> added example src file using Rcpp attributes
 >> added Rd file for rcpp_hello_world
 >> compiled Rcpp attributes 
edd@rob:/tmp$ 
edd@rob:/tmp$ R CMD INSTALL demo20200408 
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘demo20200408’ ...
** using staged installation
** libs
ccache g++ -I"/usr/share/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O3 -Wall -pipe -pedantic  -c RcppExports.cpp -o RcppExports.o
ccache g++ -I"/usr/share/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O3 -Wall -pipe -pedantic  -c rcpp_hello_world.cpp -o rcpp_hello_world.o
ccache g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o demo20200408.so RcppExports.o rcpp_hello_world.o -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (demo20200408)
edd@rob:/tmp$ 
edd@rob:/tmp$ Rscript -e 'library(demo20200408); rcpp_hello_world()'
[[1]]
[1] "foo" "bar"

[[2]]
[1] 0 1

edd@rob:/tmp$ 
edd@rob:/tmp$ echo 'r_hello_world <- function() cat("hi there\n")' > demo20200408/R/foo.R
edd@rob:/tmp$ R CMD INSTALL demo20200408 
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘demo20200408’ ...
** using staged installation
** libs
make: Nothing to be done for 'all'.
installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (demo20200408)
edd@rob:/tmp$ Rscript -e 'library(demo20200408); r_hello_world()'
hi there
edd@rob:/tmp$ 
edd@rob:/tmp$ editor demo20200408/R/foo.R    # subst. fave editor here
edd@rob:/tmp$ cat demo20200408/R/foo.R 
r_hello_world <- function() {
        cat("hi there\n")
        ignored <- rcpp_hello_world()
        NULL
}
edd@rob:/tmp$ R CMD INSTALL demo20200408 
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘demo20200408’ ...
** using staged installation
** libs
make: Nothing to be done for 'all'.
installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (demo20200408)
edd@rob:/tmp$ Rscript -e 'library(demo20200408); r_hello_world()'
hi there
NULL
edd@rob:/tmp$