首页 > 解决方案 > 带有嵌入式 R 代码的 Rcpp,不显示 R 代码的输出

问题描述

我有一个cpp定义c++R函数的文件,这些文件来源于R使用Rcpp::sourceCpp().

当我获取文件时,也会(部分)打印 R 代码,即使我指定showOutput = FALSE了(我猜它只适用于cpp代码?!)。

现在的问题是:如何在不使用capture.output()或类似技巧的情况下抑制部分 R 输出。

MWE

tester.cpp

#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericVector timesTwo(Rcpp::NumericVector x) {
  return x * 2;
}
/*** R
foo <- function(x) timesTwo(x)
*/

采购文件时,我看到以下内容:

Rcpp::sourceCpp("tester.cpp", showOutput = FALSE)
#> foo <- function(x) timesTwo(x)

更短的 MWE

Rcpp::sourceCpp(code='
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericVector timesTwo(Rcpp::NumericVector x) {
  return x * 2;
}
/*** R
foo <- function(x) timesTwo(x)
*/
')

标签: rrcpp

解决方案


这个问题是否源于对showOutput目的的误解?

看着help(sourceCpp)我们看到

showOutput: ‘TRUE’ to print ‘R CMD SHLIB’ output to the console.

它会影响实际的编译步骤,并且与作为可选位添加的任何 R 代码无关,如果存在也运行。

以下示例应该清楚地说明这一点(并揭示一些CXX和其他设置):

> cppFunction("int doubleMe(int i) { return i+i; }", showOutput=TRUE)
/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_10.so' 'file99f11710553a7.cpp' 
ccache g++ -I"/usr/share/R/include" -DNDEBUG   -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/tmp/RtmpC7dZ23/sourceCpp-x86_64-pc-linux-gnu-1.0.5.4"    -fpic  -g -O3 -Wall -pipe -pedantic  -c file99f11710553a7.cpp -o file99f11710553a7.o
ccache g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o sourceCpp_10.so file99f11710553a7.o -L/usr/lib/R/lib -lR
>
> cppFunction("int trippleMe(int i) { return i+i+i; }", showOutput=FALSE)
> 

现在,抑制R代码的输出是一个不同的主题,并且与此类代码是否包含通过制作的元素正交Rcpp

最后,@MrFlick 指出了这一点,如果您不希望将 R 代码作为sourceCpp()调用的一部分提供......那么就不要包含这样的代码!或者只是打破正则表达式/*** R


推荐阅读