[英]Error when building R package using roxygen2
我有2個文件,Rfile.R和Cppfile.cpp。
Cppfile.cpp中的內容:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int CPPF(int k){return ++k;}
Rfile.R中的內容:
RF<-function(k){return(CPPF(k))}
我想基於2個文件構建一個R包。 我使用最新版本的Rstudio和Roxygen2。
我嘗試了3種方法來構建包含或不包含Roxygen2的包,並且有不同的結果:
New Project-> New Directory-> R package-> Type:Package w / Rcpp,將Rfile.R和Cppfile.cpp都添加為源文件。 構建和重新加載,一切正常。 這些功能可以正常工作。
New Project-> New Directory-> R package-> Type:Package w / Rcpp,將Rfile.R和Cppfile.cpp都添加為源文件。 選擇“使用Roxygen生成文檔”,檢查其所有選項。 構建和重新加載,功能不起作用。 輸入“RF”給出RF的內容,輸入“CPPF”彈出“未找到對象”。
New Project-> New Directory-> R package-> Type:Package w / Rcpp,只添加Cppfile.cpp作為源文件。 選擇“使用Roxygen生成文檔”,檢查其所有選項。 Build&Reload,功能正常。 然后將Rfile.R直接復制到項目文件夾 - > R文件夾中。 Build&Reload,一切都很好,功能很好。
我使用Roxygen錯了還是Roxygen有蟲子? 我需要它來記錄。 我可以堅持第三種方式,這需要花費很多精力才能找到,但有線。
謝謝!
解決問題的一種方法:選擇“使用Roxygen生成文檔”時,請勿選中“NAMESPACE文件”選項。
你混淆了兩件事(不幸的是很容易混淆):
首先, // [[Rcpp::export]]
屬性用於在兩個文件RcppExports.cpp
和RcppExports.R
自動生成包裝函數。 包裝器R函數CPPF
將由Rcpp::compileAttributes()
在此處自動生成,並放入R/RcppExports.R
。
其次, roxygen
注釋可用於管理NAMESPACE
,例如使用@export
標記。 請注意,這是從不同 // [[Rcpp::export]]
!
自動生成的功能不會自動導出。 Rcpp.package.skeleton()
將生成一個NAMESPACE
文件,該文件自動導出給定名稱的所有函數; 即, exportPattern("^[[:alpha:]]+")
條目。 這對於小包裝來說已經足夠了; 但隨着您的軟件包變得越來越復雜,您將需要對命名空間進行更細粒度的控制。 或者您可以采用一種慣例,其中所有內部非導出函數都以a開頭.
。 無論哪種方式,此機制都允許將自動生成的函數導出到包命名空間。
如果你想使用roxygen
來管理NAMESPACE
,你需要在你的C ++函數中添加roxygen
注釋,如果你想在命名空間中導出它們的話。 所以你可以修改你的功能如下:
#include <Rcpp.h>
using namespace Rcpp;
//' @export
// [[Rcpp::export]]
int CPPF(int k){return ++k;}
請注意,對於新版本的roxygen2
,您可能必須運行roxygen2::upgradeRoxygen()
以確保roxygen2
接管NAMESPACE
。
因此,如果2.不起作用,請將其作為roxygen2團隊的(可重現的)錯誤報告提交。
我看不到Rcpp問題; Imports:/ NAMESPACE聲明可能出現問題。 我在這里看不到Rcpp問題(因為1.工作正常)。
FWIW我也在一些軟件包上使用roxygen2,我也經常在RStudio中構建它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.