R语言tryCatch循环中无法记录错误迭代下标问题求助
问题原因与解决方案
你的问题核心是R的作用域机制:tryCatch的error回调函数是独立的局部环境,里面的troublemaker <- c(troublemaker, i)仅在该局部环境创建变量,不会修改你在全局环境定义的troublemaker向量,所以最终全局的troublemaker仍为空。
以下是几种可行的解决方法:
方法1:使用全局赋值运算符<<-
直接在error回调里修改全局环境的变量,这是最直接的修改方式:
stuff <- c(12, 9, 2, "cat", 25, 10, "horse") troublemaker <- c() for (i in 1:length(stuff)) { print(i) tryCatch(expr = print(log(stuff[[i]])), error = function(e) { message('An Error Occurred!!!'); # 用<<-代替<-,修改全局环境的troublemaker troublemaker <<- c(troublemaker, i) } ) } # 查看结果 troublemaker
执行后troublemaker会正确得到[1] 4 7。
方法2:使用自定义环境存储(更规范)
如果不想直接操作全局变量,可以创建独立环境存储错误记录,避免全局环境污染:
stuff <- c(12, 9, 2, "cat", 25, 10, "horse") # 创建自定义环境 error_records <- new.env() error_records$troublemaker <- c() for (i in 1:length(stuff)) { print(i) tryCatch(expr = print(log(stuff[[i]])), error = function(e) { message('An Error Occurred!!!'); # 修改自定义环境中的变量 error_records$troublemaker <- c(error_records$troublemaker, i) } ) } # 查看结果 error_records$troublemaker
方法3:用assign指定赋值环境
通过assign函数明确指定赋值环境(这里是全局环境),效果和<<-类似但更清晰:
stuff <- c(12, 9, 2, "cat", 25, 10, "horse") troublemaker <- c() for (i in 1:length(stuff)) { print(i) tryCatch(expr = print(log(stuff[[i]])), error = function(e) { message('An Error Occurred!!!'); # 明确指定赋值到全局环境 assign("troublemaker", c(troublemaker, i), envir = .GlobalEnv) } ) } # 查看结果 troublemaker
补充说明
你之前尝试直接将赋值作为error参数导致记录所有轮次,是因为错误回调必须是接收错误对象的函数,直接写赋值语句会在循环每一轮都执行,而非仅在错误发生时执行,因此必须把赋值逻辑放在error对应的函数体内。
内容的提问来源于stack exchange,提问作者Qiyuan
相关产品推荐
相关产品推荐

