r - 带有嵌入式 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)
*/
')
解决方案
这个问题是否源于对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
。
推荐阅读
- java - 将整数的最后一位四舍五入
- android - java.lang.NullPointerException: com.firebase.ui.database.FirebaseRecyclerAdapter.startListening()' 在空对象引用上
- jquery - 如何通过 JQuery 为 div 元素设置自定义属性
- elasticsearch - 分片(Elasticsearch)是否有自己的 JVM 设置
- excel - 如何在excel的两列中排列重复的条目?
- git - "git log" "tag:" 跨 repos 不一致
- c++ - 将静态库链接到共享:标头中的枚举类 -> 针对未定义符号重定位 R_X86_64_PC32
- php - 在 Laravel 中显示 cron 工作
- reactjs - 幕后 React JS 中的单击事件有效吗?
- vba - ComboBox Enter 事件从对象浏览器中消失