首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:如何存储逐字= TRUE的消息

R:如何存储逐字= TRUE的消息
EN

Stack Overflow用户
提问于 2017-06-27 04:16:46
回答 2查看 992关注 0票数 1
代码语言:javascript
运行
复制
library(nlme)
fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
              data = Loblolly,
              fixed = Asym + R0 + lrc ~ 1,
              random = Asym ~ 1,
              start = c(Asym = 103, R0 = -8.5, lrc = -3.3), verbose = TRUE)

# **Iteration 1
# LME step: Loglik: -114.787, nlminb iterations: 1
# reStruct  parameters:
#      Seed 
# -1.669062 
# PNLS step: RSS =  43.40812 
#  fixed effects: 101.4496  -8.627331  -3.233751  
#  iterations: 4 
# Convergence crit. (must all become <= tolerance = 1e-05):
#      fixed   reStruct 
# 0.02048682 0.02712258 
# 
# **Iteration 2
# LME step: Loglik: -114.7428, nlminb iterations: 1
# reStruct  parameters:
#      Seed 
# -1.624988 
# PNLS step: RSS =  43.40812 
#  fixed effects: 101.4496  -8.627331  -3.233751  
#  iterations: 1 
# Convergence crit. (must all become <= tolerance = 1e-05):
#    fixed reStruct 
#        0        0 

特别是,我指的是nlme函数调用,但我认为该解决方案可以推广到其他verbose = TRUE生成的输出中。基本上,我想存储冗长的文本(从**迭代1开始)。有没有办法在R中做到这一点?

编辑: Gregor的答案对于上面的例子非常有用(算法在这里收敛)。如果算法没有收敛呢?

代码语言:javascript
运行
复制
u2 = evaluate({
fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
            data = Loblolly,
            fixed = Asym + R0 + lrc ~ 1,
            random = Asym ~ 1,
            start = c(Asym = 103, R0 = -10, lrc = -8), verbose = TRUE)
})
> cat(u2[[2]])
# Error in cat(u2[[2]]) : object 'u2' not found
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-27 05:14:48

对于这样的任务,evaluate包非常方便。下面是一个例子

代码语言:javascript
运行
复制
library(evaluate)
library(nlme)

u = evaluate({
  fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
              data = Loblolly,
              fixed = Asym + R0 + lrc ~ 1,
              random = Asym ~ 1,
              start = c(Asym = 103, R0 = -8.5, lrc = -3.3), verbose = TRUE)
})

# get the output in character form
output_str = u[[2]]

# check if everything worked
cat(output_str)

如果您希望更好地控制保存哪种类型的输出,请查看 documentation

如果出现错误,建议将表达式包装在函数中。

代码语言:javascript
运行
复制
u2 = evaluate({
  function(){
    fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, 
                fixed = Asym + R0 + lrc ~ 1, 
                random = Asym ~ 1, 
                start = c(Asym = 103, R0 = -10, lrc = -8), 
                verbose = TRUE)
  }
})

然后,可以从u2[[3]]中捕获错误消息。

编辑:既然您问了,运行它将显示new_output_handler函数如何工作

代码语言:javascript
运行
复制
my_output_handler = new_output_handler(
  error = function(x) {
    cat("source_prefix:", as.character(x))
  }
)

u2 = evaluate({
  function(){
    fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, 
                fixed = Asym + R0 + lrc ~ 1, 
                random = Asym ~ 1, 
                start = c(Asym = 103, R0 = -10, lrc = -8), 
                verbose = TRUE)
  }
}, output_handler = my_output_handler)

replay(u2)
票数 1
EN

Stack Overflow用户

发布于 2017-06-27 05:30:31

将输出发送回控制台:sink()用于输出,sink(type = "message")用于stderr。参见? sink中的示例。

请参阅How to capture RCurl verbose output

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44772174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档