是否可以使用 R 的 C/C++ 打印函数覆盖 R 控制台输出?
Rcpp::sourceCpp( code = '
#include <Rcpp.h>
// [[Rcpp::export]]
void print_test() {
for(int i = 0; i < 10; i++) {
std::stringstream strs;
strs << "number: " << i;
std::string temp_str = strs.str();
char const* char_type = temp_str.c_str();
REprintf(char_type);
}
}'
)
print_test()
该函数的输出是
number: 0number: 1number: 2number: 3number: 4number: 5number: 6number: 7number: 8number: 9
但我希望它是一个动态序列。例如:
number: 0
等待几秒钟:
number: 1
where number: 0
已从控制台中完全删除。重复此过程直到number: 9
到达了。
我见过this问题,但我无法获得与 REprintf() 一起使用的回车解决方案。
为了获得正确的更新R控制台,您将需要使用Rinterfaces.h标头。该标头仅适用于类 UNIX 系统。因此,您的进度更新将break在 Windows 上。
特别是,您应该使用REprintf
(标准错误)或Rprintf
(标准输出)结合R_FlushConsole
更新控制台。这里的关键是用环绕输出"\r"
或回车,强制返回到行的开头。这将导致打印您的值,然后“删除”前一行。
在此过程中,检查用户中断可能是有利的(例如,如果用户按下退出键,则退出该过程)。因此,我添加了一个调用R_CheckUserInterrupt()
.
最后,为了强调正在发生更新,我选择slow通过强制它每秒左右睡眠一次来循环。
#include <Rcpp.h>
// for unix-alike machines only
#if !defined(WIN32) && !defined(__WIN32) && !defined(__WIN32__)
#include <unistd.h>
#include <Rinterface.h>
#endif
// [[Rcpp::export]]
void print_test() {
int n = 10;
for(int i = 0; i < n; i++) {
#if !defined(WIN32) && !defined(__WIN32) && !defined(__WIN32__)
// Sleep for a second
usleep(1000000);
#endif
std::stringstream strs;
strs << "number: " << i;
std::string temp_str = strs.str();
char const* char_type = temp_str.c_str();
REprintf("\r");
REprintf("%s", char_type);
REprintf("\r");
#if !defined(WIN32) && !defined(__WIN32) && !defined(__WIN32__)
R_FlushConsole();
#endif
R_CheckUserInterrupt();
}
}
Example:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)