抑制C ++代码中“printf”显示的消息,而不是R中的“message”或“warning”

时间:2014-10-30 18:02:24

标签: c r

只是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!!

1 个答案:

答案 0 :(得分:0)

扎克,你有更多的背景吗?你是在谈论我曾经为Google Summer of Code指导过的CRAN包RPostgreSQL,后来得到了维护(现在由Tomoaki Nishiyama负责),因为CRAN不允许实际printfstd::coutSection 6.5 of Writing R Extensions

您通常可以访问Tomoaki读取的r-sig-db上的数据库软件包的维护者,并且我们(也有)一个rpostgresql的dedidated列表。 Tomoaki非常敏感,我建议使用适当的场地。通风没有帮助。我只抓住了它,因为你(错误地?)将Rcpp标签粘在了它上面。或者你偶然的意思是Tim Keitt的(非常不同的)rpg,但错误地提到了RPostgreSQL

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

所以你似乎抱怨的是(在RPostgreSQL资源中找到第一个grep

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

因此我相当肯定RMySQL会做同样的事情。鉴于这是一个程序化的用途,如果准备好的字符串(或者更确切地说,char向量),我认为你实际上可以抑制它。

如果我是你,我会看一下来源和/或询问r-sig-db。