RCPP Armadillo:在函数中打印整数值

Posted

技术标签:

【中文标题】RCPP Armadillo:在函数中打印整数值【英文标题】:RCPP Armadillo: Print integer value in function 【发布时间】:2020-07-10 01:42:05 【问题描述】:

CPP 和 RCPP 新手

我正在将一个 R 包与 RCPP 放在一起。

这是我的步骤:

    转移到包含包的目录。 运行 compileAttributes(pkgdir = ".",verbose=TRUE) 然后从 devtools 运行构建和安装。

我希望我的 CPP 函数之一在调用时打印一条消息。 所以我补充说:

Rcpp::Rcout << "Hello World!" << std::endl;

然后我完成了上面的步骤 1 到 3。但是没有雪茄。连小雪茄都没有。

理想情况下,我希望它打印出一个整数值 i,类似于

示例代码。

Rcpp::Rcout << i << std::endl;

到目前为止,它已经编译并且函数运行了——但没有打印出亲爱的变量。帮助!下面是我的功能示例。我怀疑有一些标准方法可以将值传递给 R 或简单地从 CPP 打印。

    # include <RcppArmadillo.h>
    // [[Rcpp::depends(RcppArmadillo)]]
    // [[Rcpp::plugins(cpp11)]]

    using namespace Rcpp ;
    arma::mat sillyme (arma::mat FE) 
  
    arma::mat FEE = FE ;
    Rcpp::Rcout << "Hello World!" << std::endl;
    Rcpp::Rcout << FE.n_rows << std::endl;

    return(FEE) ;
    

【问题讨论】:

帮助我们帮助您:提供minimal reproducible example。我将从一个独立的 C++ 文件开始,该文件导出具有 // [[Rcpp::export]] 属性的函数并以这种方式重现不需要的行为,然后你有一个简单的最小可重现代码到 edit 到你的问题中,以便我们能够看到什么问题是。 同意,请参阅更新。我不想发布完整的项目骨架等。 也许你应该,或者至少也许你应该更仔细地查看骨架生成的内容:在一个包中你不需要Rcpp::depends()Rcpp::plugins(),因为这在@987654329 中处理@ 文件级别(也可能是 src/Makevars,但现在 C++11 已经是默认值了)。一切无害——但细节很重要 这里有一个例子,但不可重现;我在“答案”中演示了此代码按您描述的那样工作。您是否在自己的机器上尝试过这个exact 代码?它编译得好吗?如果是这样,当您从 R 中调用它时,它究竟表现如何? 优秀的点让我试着提炼一下我的情况。 【参考方案1】:

在我的系统(Ubuntu 20.04,R 4.0.0)上,这可以正常工作(在添加 // [[Rcpp::export]] 属性以确保可以从 R 调用该函数之后):

sillyme(diag(2))
# Hello World!
# 2
#      [,1] [,2]
# [1,]    1    0
# [2,]    0    1

【讨论】:

是的,[[Rcpp::export]] 在一个包中很重要!如果它丢失了,你会得到一个警告,如果你忽略那些......那么你可能会得到令人失望的结果。

以上是关于RCPP Armadillo:在函数中打印整数值的主要内容,如果未能解决你的问题,请参考以下文章

(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat

如何通过在 Rcpp 或 Armadillo 中将矩阵乘以向量元素来复制 R 的功能?

Rcpp Armadillo:RStudio 说“exp”不明确

Parallel 和 Rcpp Armadillo 的问题:集群工作人员之间可能存在变量损坏

rowsum 的 Rcpp 等效项 [关闭]

从 Rcpp Armadillo 中的 sp_mat 访问维度名称