就like this question ,但这个包的作者更令人烦恼,并且使用 printf
和 snprintf
在 C/C++ 代码中显示消息、警告和错误的混合:
library('inline')
silly_developer_cxx_function <- cxxfunction(
signature(x = "integer"),
'printf("%s", "Seriously! Thanks for using my function!!");
return ScalarReal(INTEGER(x)[0]);'
)
silly_developer_function <- function(i){
print("Thanks for using my function!!")
return(silly_developer_cxx_function(as.integer(i)))
}
我可以使用capture.output
抑制R级打印语句,但sprintf
语句似乎无法杀死:
> capture.output(x <- silly_developer_function(1L), file='/dev/null')
Seriously! Thanks for using my function!!
最佳答案
扎克,你有更多背景信息吗?您是在谈论 CRAN 包 RPostgreSQL我曾经为 Google Summer of Code 提供指导,后来维护了它(现在由 Tomoaki Nishiyama 负责),因为 CRAN 不允许实际的 printf
或 std::cout
每Section 6.5 of Writing R Extensions .
您通常可以联系 Tomoaki 阅读的 r-sig-db 上的数据库包的维护者,并且我们也有(有?) rpostgresql 的专用列表。 Tomoaki 的 react 非常灵敏,我建议使用合适的 field 。通风没有帮助。我之所以发现它是因为你(错误地?)在上面粘贴了 Rcpp
标签。或者您是否偶然指的是(非常不同)rpg作者:Tim Keitt,但被错误地引用 RPostgreSQL相反?
编辑:一些历史记录。我们从来没有合适的 PostgreSQL 后端。因此建议将此作为 Google Summer of Code 的主题,一名学生接受了它并编写了第一个有点黑客的版本。主要是看看 RMySQL 做了什么并适应 PostgreSQL API。因为行为是由R/S定义的数据库接口(interface)——DBI来定义的。
所以你似乎提示的是(在 RPostgreSQL 源代码中找到的第一个 grep
)
(void) sprintf(buf, msg, (int) mgr->length);
RS_DBI_errorMessage(buf, RS_DBI_ERROR);
因此我相当肯定 RMySQL 也会做同样的事情。鉴于这是一个编程使用,如果准备好的字符串(或者更确切地说,char
vector ),我认为你实际上可以抑制它。
如果我是你,我会查看源代码和/或询问 r-sig-db。
关于c - 抑制 C++ 代码中的 “printf” 而不是 R 中的 “message” 或 “warning” 显示的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660178/