【问题标题】:If (something got printed) x=false, how to do this in R?如果(打印的东西)x = false,如何在R中做到这一点?
【发布时间】:2014-02-21 01:30:55
【问题描述】:

所以我在 R 中使用了一个使用编译的 fortran 代码的函数。使用此功能时,lsoda,在包deSolve 中。我将消息打印到屏幕上,例如

DLSODA-  At current T (=R1), MXSTEP (=I1) steps   
       taken on this call before reaching TOUT     
In above message, I = 
[1] 5000
In above message, R = 
[1] 21.31629

问题是上面不是“警告”或“错误”;看到此消息后,is.null(warnings()) 评估为 TRUE。如果这是一个警告,我可以写x = is.null(warnings()),这样就可以了。我可以使用 tryCatch 来处理错误,但是既不是错误也不是警告的消息呢?

我问的原因是,这个函数是在 for 循环中的 while 循环中调用的。如果此消息被打印,我希望 while 循环中断,然后外部 for 循环进入下一次迭代。通常你会使用 tryCatch 来做这样的事情,但是因为没有错误,我不知道该怎么做

【问题讨论】:

  • 您可以重定向输出,然后检查它是否包含类似的内容。请提供可重现的示例
  • @JulianUrbano 嗯,不知道你的意思是什么,我想知道的原因是如果这个消息被打印出来,我想要一个内部 while 循环中断,然后是外部 while 循环进入下一个迭代。通常你会使用 tryCatch 来做这样的事情,但因为没有错误,我不知道该怎么做
  • 请给我们一个可重现的例子,以便我们向您展示如何重定向
  • 也许您可以使用“capture.output”并匹配您正在寻找的消息
  • @JuliánUrbano 我的例子又长又丑又慢,我想不出一个包含问题本质的玩具问题。也许如果你包含一个指向你所说的重定向的链接,谷歌搜索“R 中的重定向”并没有产生我认为你所建议的内容。

标签: r


【解决方案1】:

你可以重定向输出,然后检查lsoda是否打印了一些东西:

out <- capture.output(lsoda(...))
if(length(grep("In above message", out))!=0) {
   # error
}

我们基本上检查lsoda打印的任何行是否包含字符串In above message。如果需要使用lsoda的结果,也可以这样运行:

out <- capture.output(result <- lsoda(...))

按照建议,您也可以使用grepl

if(any(grepl("In above message", out))) {
   # error
}

【讨论】:

  • grepl 获取快捷方式
  • capture.output 正是我想要的!非常感谢。一旦我验证这适用于我的代码(看起来应该),将立即接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2015-10-14
  • 2016-10-01
  • 2021-07-06
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多