簡體   English   中英

使用roxygen2構建R包時出錯

[英]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的包,並且有不同的結果:

  1. New Project-> New Directory-> R package-> Type:Package w / Rcpp,將Rfile.R和Cppfile.cpp都添加為源文件。 構建和重新加載,一切正常。 這些功能可以正常工作。

  2. New Project-> New Directory-> R package-> Type:Package w / Rcpp,將Rfile.R和Cppfile.cpp都添加為源文件。 選擇“使用Roxygen生成文檔”,檢查其所有選項。 構建和重新加載,功能不起作用。 輸入“RF”給出RF的內容,輸入“CPPF”彈出“未找到對象”。

  3. 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.cppRcppExports.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM