R 检查不喜欢 std:cout (C++)

Posted

技术标签:

【中文标题】R 检查不喜欢 std:cout (C++)【英文标题】:R check doesn't like std:cout (C++) 【发布时间】:2015-01-17 21:49:37 【问题描述】:

我正在尝试向 CRAN 提交一个包含 C++ 代码的包(我不知道 C++,cpp 文件是由其他人编写的)。

R 检查抱怨 'std::cout' (C++) 编译后的代码不应调用可能终止 R 的入口点,也不应调用 写入 stdout/stderr 而不是控制台,也不是 C RNG

我在代码中发现了以下命令:

 integrate_const(stepper_type( default_error_checker< double >( abs_error , rel_error ) ),
                mDifEqn,
                x,
                0.0,
                (precipitationLength * timeStep), 
                timeStep,
                streaming_observer(std::cout) ); 

我猜 R (CRAN) 期待别的东西而不是 std::cout...但是什么?

【问题讨论】:

【参考方案1】:

您的 C++ 项目可能正在使用标准输入和输出。

正如编写 R 扩展手册中所讨论的那样,问题是您最终会混合 两个 输出系统:R 和 C++ 一个。

因此,您被“鼓励”替换所有用途,例如,

 std::cout << "The value of foo is " << foo << std::endl;

类似的东西

 Rprintf("The value of foo is %f\n", foo);

以便您的输出与 R 正确混合。在我的一个(非 Rcpp)包中,我不得不为此做很多乏味的补丁......

现在,正如@vasicbre 的评论和@Dason 的回答中所述,如果您使用 Rcpp,您可以简单地做

 Rcpp::Rcout << "The value of foo is " << foo << std::endl;

如果您已经使用 Rcpp,这很容易,否则您需要确定是否值得添加 Rcpp...

编辑:修正了Rcpp::Rcout 中的错字。

【讨论】:

非常感谢,我目前不使用 Rcpp,但是......我会读一下。【参考方案2】:

如果您想流式传输到 R 的缓冲输出,您需要使用 Rcpp::Rcout 而不是 std::cout。

有关更多详细信息,您可以阅读 Rcpp 的一位作者撰写的这篇文章:http://dirk.eddelbuettel.com/blog/2012/02/18/

【讨论】:

以上是关于R 检查不喜欢 std:cout (C++)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 StringStream/c_str() 损坏

如何制作一个不刷新 std::cout 的简单 C++ 程序

c++ 函数重载不明确

C++:奇怪的 std::cout 错误

c++读取文件

C++,三元运算符,std::cout