在编写R语言函数进行批量处理时,我们常会遇到处理某个数据时出现错误,但是希望(1)跳过该错误继续运行,并且记录错误的具体位置。(2)爬取信息时,对错误的地方忽略错误,继续运行,直到成功为止。
1、编写一个运算的函数,按行处理一个数据框里面的全部数据,计算出结果添加在数据框后面,中途有一行的数据存在问题,忽略错误继续运行完全部结果,将错误的地方填充为NA。
process_data <- function(data_frame, calculation_function) {
# 创建一个新的矩阵用于存储结果
result <- matrix(ncol = ncol(data_frame) + 1, nrow = nrow(data_frame))
colnames(result) <- c(colnames(data_frame), "Result")
# 迭代处理每行数据
for (i in 1:nrow(data_frame)) {
# 捕捉可能出现的错误
tryCatch({
# 运行计算函数并将结果存储在结果矩阵中
result[i, ] <- c(as.character(data_frame[i, ]), calculation_function(as.numeric(data_frame[i, ])))
}, error = function(e) {
# 输出错误信息
cat("Error at row", i, ":", conditionMessage(e), "\n")
# 将错误的行填充为 NA
result[i, ] <- c(as.character(data_frame[i, ]), NA)
})
}
# 将结果转换为数据框并返回
result_df <- as.data.frame(result)
return(result_df)
}
data<-data.frame(x=c(1,2,3),y=c(3,4,"asd"))
qwe<-process_data(data,sum)
2、存在错误或警告,继续尝试,中途每次停三秒,输出尝试次数。
process_data <- function(data_frame, calculation_function) {
# 创建一个新的矩阵用于存储结果
result <- matrix(ncol = ncol(data_frame) + 1, nrow = nrow(data_frame))
colnames(result) <- c(colnames(data_frame), "Result")
# 迭代处理每行数据
for (i in 1:nrow(data_frame)) {
# 定义尝试次数、最大尝试次数和延迟时间
attempts <- 0
max_attempts <- 3
delay <- 3
# 进行尝试
while (attempts < max_attempts) {
tryCatch({
# 运行计算函数并将结果存储在结果矩阵中
result[i, ] <- c(as.character(data_frame[i, ]), calculation_function(as.numeric(data_frame[i, ])))
# 如果成功运行计算函数,则跳出尝试循环
break
}, error = function(e) {
# 输出错误信息和尝试次数
cat("Error at row", i, ":", conditionMessage(e), "\n")
# 延迟一定时间后再次尝试
Sys.sleep(delay)
}, warning = function(w) {
# 输出警告信息和尝试次数
cat("Warning at row", i, ":", conditionMessage(w), "\n")
# 延迟一定时间后再次尝试
Sys.sleep(delay)
})
# 尝试次数+1
attempts <- attempts + 1
}
# 如果仍然出现错误,则将错误的行填充为NA
if (attempts == max_attempts && is.na(result[i, "Result"])) {
result[i, ] <- c(as.character(data_frame[i, ]), NA)
}
}
# 将结果转换为数据框并返回
result_df <- as.data.frame(result)
return(result_df)
}
data <- data.frame(x = c(1, 2, 3), y = c(3, 4, "asd"))
qwe <- process_data(data, sum)
通过上述示例,不难发现主要用到了tryCatch、for和while。实际情况需要灵活处理。