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的答案对于上面的例子非常有用(算法在这里收敛)。如果算法没有收敛呢?
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
发布于 2017-06-27 05:14:48
对于这样的任务,evaluate
包非常方便。下面是一个例子
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。
如果出现错误,建议将表达式包装在函数中。
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
函数如何工作
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)
发布于 2017-06-27 05:30:31
将输出发送回控制台:sink()
用于输出,sink(type = "message")
用于stderr。参见? sink
中的示例。
https://stackoverflow.com/questions/44772174
复制相似问题