gpt4 book ai didi

r - 在 R 中使用带有 while 循环的 tryCatch

转载 作者:行者123 更新时间:2023-12-02 01:33:16 24 4
gpt4 key购买 nike

我正在尝试在 R 中使用 while 循环实现 tryCatch,但一直遇到问题。我已尝试实现许多建议的解决方案(围绕 for 循环),但没有成功。

本质上,我是在使用 R 查询 API 并循环访问一些相关参数(准确地说是经度和纬度)。我需要一个 tryCatch block 的原因是因为有时 URL 请求会失败,这反过来会停止脚本运行。我希望能够做的是忽略错误,将循环计数器增加 1 并继续提取。

我设置的 while 循环是(仅供引用 - 长度是指被循环的数据帧的长度):

i <- 1
while(i <= length) {
x_cord <- geocode_area$X[i]
y_cord <- geocode_area$Y[i]
target <- getUrl(x_cord,y_cord)
dat <- fromJSON(target)
geocode_area$Block[i] <- dat$result$geographies$`2010 Census Blocks`[[1]]$BLOCK
print(paste(i/length*100,"% completed",sep=""))
print(dat$result$geographies$`2010 Census Blocks`[[1]]$BLOCK)
i <- i + 1
}

getUrl() 函数定义为:

getUrl <- function(x,y) {
root <- "http://geocoding.geo.census.gov/geocoder/geographies/coordinates?"
u <- paste0(root,"x=", x,"&y=", y,"&benchmark=4&vintage=4&format=json")
return(URLencode(u))
}

while 循环的输入 data.frame 看起来像这样(请注意我已经输入了字符串来模拟错误以测试 tryCatch 是否正常工作):

          X                 Y          Block
1 -122.425891675136 37.7745985956747 0
2 -122.42436302145 37.8004143219856 0
3 -122.426995326766 37.8008726327692 0
4 -122.438737622757 37.7715411720578 0
5 abc zsads 0

我尝试了一些 SO 和其他解决方案,但结果似乎无法正常工作。谁能帮忙?

谢谢!

jack

最佳答案

一般说明 - 您的代码有点奇怪。我会推荐一个 for 循环,或者可能更好的一个函数来做这些事情。但是你可以让你的循环工作。

# A minimal working version
library(RJSONIO)
options(stringsAsFactors = FALSE)

# Create a data frame with the example data
geocode_area <- data.frame(X = c("-122.425891675136","-122.42436302145","-122.426995326766","-122.438737622757","abc"),
Y = c("37.7745985956747","37.8004143219856","37.8008726327692","37.7715411720578","zsads"),
Block = c(0,0,0,0,0))

# Your old function, unchanged
getUrl <- function(x,y) {

root <- "http://geocoding.geo.census.gov/geocoder/geographies/coordinates?"
u <- paste0(root,"x=", x,"&y=", y,"&benchmark=4&vintage=4&format=json")
return(URLencode(u))
}

# Getting the length parameter
length <- nrow(geocode_area)
i <- 1
while(i <= length) {

x_cord <- geocode_area$X[i]
y_cord <- geocode_area$Y[i]
target <- getUrl(x_cord,y_cord)

# Here be new code
# Do a try(), with silent = TRUE, which suppresses outputs to STDERR
# In principle, this is dangerous - a better approach is to strip out the offending data before invoking it
# Errors are, after all, there for a reason
dat <- try(fromJSON(target),silent = TRUE)

# Now, we conditionally complete the next steps
# If the class of dat is not a try-error, perform your normal operations
# Otherwise, bypass and print a note to the console
if(class(dat) != "try-error") {

geocode_area$Block[i] <- dat$result$geographies$`2010 Census Blocks`[[1]]$BLOCK
print(paste(i/length*100,"% completed",sep=""))
print(dat$result$geographies$`2010 Census Blocks`[[1]]$BLOCK)
} else if (class(dat) == "try-error") {print("Error encountered, bypassing")}
i <- i + 1
}

编辑添加:显然,这使用 try() 而不是 tryCatch()。但是,由于张贴者最终使用了 try() 并且这可能代表了一种不同的实现方式,所以我想我应该放弃它。

关于r - 在 R 中使用带有 while 循环的 tryCatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com