从FitDistripPlus包中使用fitdist()时禁止显示错误消息

从FitDistripPlus包中使用fitdist()时禁止显示错误消息,r,error-handling,try-catch,error-suppression,fitdistrplus,R,Error Handling,Try Catch,Error Suppression,Fitdistrplus,我正在使用fitdistrplus包中的某些函数作为我正在创建的包的一部分 我试图阻止在运行函数时在控制台中显示任何错误消息,而是希望将错误消息记录在我正在创建的错误日志中 在大多数情况下,使用tryCatch()可以实现这一点 但特别是对于fitdist()函数,我无法抑制控制台中打印的错误消息,即使消息正在写入错误日志(意味着tryCatch()表达式正在运行) 我已经在下面的代码中复制了我的问题 library(fitdistrplus) file.create("error_log.t

我正在使用
fitdistrplus
包中的某些函数作为我正在创建的包的一部分

我试图阻止在运行函数时在控制台中显示任何错误消息,而是希望将错误消息记录在我正在创建的错误日志中

在大多数情况下,使用
tryCatch()
可以实现这一点

但特别是对于
fitdist()
函数,我无法抑制控制台中打印的错误消息,即使消息正在写入错误日志(意味着
tryCatch()
表达式正在运行)

我已经在下面的代码中复制了我的问题

library(fitdistrplus)

file.create("error_log.txt")

func_desc<-function(x){
  tryCatch({
    descdist(data = x)
  },error = function(e){
    write(x = paste(Sys.time(),"Error in func_desc :",e$message,sep = " "),file = "error_log.txt",append = T,sep = "\n")
  })
}

func_fit<-function(x,dist){
  tryCatch({
    fitdist(data = x,distr = dist)
  },error = function(e){
    write(x = paste(Sys.time(),"Error in func_fit :",e$message,sep = " "),file = "error_log.txt",append = T,sep = "\n")
  })
}

# Creating a vector of repeated values which will result in an error
test<-rep(x = 1,times = 10)

func_desc(x = test)
# Results in an error and the message is written to the error log and not printed in the console

func_fit(x = test,dist = "beta")
# Results in an error and the message is both written to the error log and printed in the console
库(FitDistripPlus)
创建(“error_log.txt”)

func_desc这是因为
fitdist
(或者实际上,
fitdist
调用的
mledist
)已经在执行一些错误捕获。原始错误在
optim
中,已被捕获,然后
mledist
将错误消息打印到控制台。因此,您看到的并不是真正的错误,甚至不是警告,而是包含捕获的错误消息内容的打印语句

执行此操作的
mledist
位为:

    if (inherits(opttryerror, "try-error")) {
        warnings("The function optim encountered an error and stopped.")
        if (getOption("show.error.messages")) 
            print(attr(opttryerror, "condition"))
        return(list(estimate = rep(NA, length(vstart)), convergence = 100, 
            loglik = NA, hessian = NA, optim.function = opt.fun, 
            fix.arg = fix.arg, optim.method = meth, fix.arg.fun = fix.arg.fun, 
            counts = c(NA, NA)))
    }
这不是一个很好的做法,因为它会导致你现在的问题;它阻止其他人系统地处理错误

从该代码中可以看到,您可以通过将
show.error.messages
选项设置为FALSE来关闭此选项:

options(show.error.messages = FALSE)
但是您需要注意这一点,因为在R会话的其余部分,您不会看到任何错误消息。你肯定不想在别人的会议上这样做


另一种选择是使用
sink(“extra error messages.txt”)
将所有打印内容发送到控制台的某个位置(甚至可能发送到您的
error\u log.txt
,但我不确定这是否会导致写入多个内容时出现问题)。

嘿,我认为问题是,您的错误消息来自C代码。OpTIM调用源代码<代码>中的CopOpTIM文件。Exulal2(CopopTIM,PAR,FN1,GR1,方法,CON,下,上)调用CopopTIM函数。因为我不确定这个错误是否有这个来源,所以我不会写这个作为答案。这可以解释为什么你不能静音。(请参阅)因此,要么这对您有效,要么另一种方法(不推荐)正在重写源代码。感谢您的回复。我尝试使用该线程中建议的解决方案,但CRAN上不再提供
多核
包。
multicore
页面上说可以使用
parallel
作为替代方案。我已经阅读了它的文档,但我不知道如何在我的案例中使用它。谢谢你的回复。它让我很好地了解了是什么产生了错误消息。我不想完全禁用错误消息打印,因为这些函数是我正在开发的包的一部分,这可能会给安装包的任何人带来问题。我将尝试使用水槽,看看是否有效。使用水槽效果很好。由于我在多个变量上迭代这个函数,我最初得到一个错误,说“sink stack已满”,但我可以解决这个问题。我已经尝试了太多的方法来解决这个问题几个星期了。你无法想象我在这一刻不再看到那个丑陋的东西在控制台上打印而感到宽慰。非常感谢您的帮助:)