【问题标题】:suppress messages displayed by “printf” in C++ code instead of “message” or “warning” in R抑制由 C++ 代码中的“printf”而不是 R 中的“消息”或“警告”显示的消息
【发布时间】:2014-10-30 18:02:23
【问题描述】:

只是like this question,除了这个包作者更令人烦恼的是使用printfsnprintf在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!!

【问题讨论】:

  • 这是一个严重的实现缺陷,你联系过包的作者吗?也许她觉得这很有趣,但对我们所有人来说,这只是烦人......
  • @Stefano Sanfilippo 我正在联系有问题的包的作者,但同时我正在尝试解决这个错误。

标签: c r


【解决方案1】:

扎克,你有更多的上下文吗?你是在谈论 CRAN 包 RPostgreSQL,我曾经为 Google Summer of Code 指导过,后来维护(现在由 Tomoaki Nishiyama 非常有能力),因为 CRAN 不允许实际的 printfstd::cout per Section 6.5 of Writing R Extensions.

您通常可以联系到 Tomoaki 读取的 r-sig-db 上的 DB 包的维护者,而且我们(有?)也有 rpostgresql 的专用列表。 Tomoaki 反应灵敏,我建议使用合适的场地。通风没有帮助。我只是因为你(错误地?)在上面贴了Rcpp 标签而抓住了它。或者您是不是碰巧指的是 Tim Keitt 的(非常不同的)rpg,却被错误地称为RPostgreSQL

编辑:一些历史。我们从来没有合适的 PostgreSQL 后端。因此建议将此作为 Google Summer of Code 的主题,一名学生接受并编写了第一个有点骇人听闻的版本。主要是通过查看 RMySQL 做了什么并适应 PostgreSQL API。因为行为是由数据库接口——DBI 的 R/S 定义定义的。

所以你似乎抱怨的是(首先在 RPostgreSQL 源代码中找到 grep

    (void) sprintf(buf, msg, (int) mgr->length);
    RS_DBI_errorMessage(buf, RS_DBI_ERROR);

因此我相当肯定 RMySQL 也是如此。鉴于如果准备好的字符串(或者更确切地说,char 向量)是一种编程用途,我认为您实际上可以抑制它。

如果我是你,我会查看源代码和/或询问 r-sig-db。

【讨论】:

  • 嗨,Dirk,很抱歉。我修复了标签。我确实是指 CRAN 上的RPostgreSQL。它使用sprintfsnprintf,这似乎是printf 的变体(虽然我很难说)。他们的输出似乎绕过了 R。 capture.output(suppressMessages(suppressWarnings(x &lt;- dbGetQuery(con, 'bogus query;'))), file='/dev/null'); print(x),其中 con 是与 PostgreSQL 数据库的连接。
  • 如果有帮助,我的会话信息是:R version 3.1.1 (2014-07-10) Platform: x86_64-apple-darwin13.1.0 (64-bit) locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] RPostgreSQL_0.4 DBI_0.3.1
  • 认为你误会了。查看手册页或 C 库站点。 sprintfsnprintf 都打印到 string,因此前导 s。对那个字符串重要的是什么。 R 对不让我们直接使用 (f)printf 感到很奇怪,因为人们无法从 R 中过滤/抑制,因为这些将在 R 的 I/O 之外。因此,正如我提到的,WRE 的第 6.5 节。
  • 嗯,所以我看到的不可抑制的打印语句必须来自 postgres 驱动程序本身。我(错误地)假设它一定来自 RPostgreSQL
  • 不确定,这可能是对 API 扩展的请求。您可以在列表中找到 Tomoaki ;-)
猜你喜欢
  • 2012-02-06
  • 2012-02-09
  • 1970-01-01
  • 2014-08-30
  • 2022-08-20
  • 2015-04-04
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多