【问题标题】:Go to next iteration of lapply() if error in r [duplicate]如果 r [重复] 中出现错误,则转到 lapply() 的下一次迭代
【发布时间】:2020-11-20 20:30:21
【问题描述】:

我正在使用 RSelenium 和 lapply() 来抓取一组相当复杂的页面。我偶尔会遇到页面未按预期加载的问题,因此代码失败。

这种情况很少发生,与其尝试处理所有可能的错误,我只想跳过当前迭代并继续下一个迭代。看起来 tryCatch() 是我正在寻找的,但我不确定将它放在代码中的哪个位置。

我知道这还不完整,但我希望这足以继续下去,因为看起来 tryCatch() 被包裹在 lapply() 或 return() 语句中。提前致谢。

team_id <- c(1:10)
df_list <- lapply (1:length(team_id), function(x) {
        # complex navigation and scraping of multiple sub tables
        # to create a final teamtable
        <code>
        return(teamtable)
})
df <- data.table::rbindlist(df_list)

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    让我们举个例子来取一个数的平方根。

    x <- list(1, 3, 4, 'a', 5)
    
    do.call(rbind, lapply(x, function(p) {
           sqrt(p)
    }))
    

    sqrt(p) 中的错误:数学函数的非数字参数

    为避免错误,您可以按以下方式使用tryCatch

    do.call(rbind, lapply(x, function(p) {
        tryCatch(sqrt(p), error = function(e) return(NULL))
    }))
    
    #         [,1]
    #[1,] 1.000000
    #[2,] 1.732051
    #[3,] 2.000000
    #[4,] 2.236068
    

    根据您希望最终输出的方式,您可以决定是在最终输出中发送NULL 还是发送NA。当您 rbind NULL 的值时,它们会被忽略,而 NA 的值仍会保留在数据中,表明输入不是您所期望的并且出现了一些错误。


    对于您的情况,您可以这样做:

    df_list <- do.call(rbind, lapply(x, function(p) {
                   tryCatch({
                    <code>
                     return(teamtable)
                }, error = function(e) return(NULL))
               })) 
    

    【讨论】:

    • 所以根据你的例子我想添加tryCatch( &lt;code&gt; return(teamtable), error = function(e) return(NULL))?我在整个 中都收到了一个 <i>expected ',' after expression</i> 警告。
    • 尝试将您的&lt;code&gt; 包裹在{} 中。请参阅答案中的更新。
    • 为什么不返回 NA 而不是 NULL? NULL 删除元素,扭曲顺序等
    • 是的,因为我在答案中包含了取决于 OP 的需要,我们可以选择是否要返回 NANULL。由于 OP 正在抓取,有时您感兴趣的只是最终组合表。
    • 感谢@RonakShah 似乎成功了。 @Onyambu,是的,我只是想跳过它,因为在那个级别它没有可以从中获取数据的基础表,但是您对 NA 的建议在脚本的另一部分很有帮助,所以谢谢你们俩。跨度>
    猜你喜欢
    • 2017-01-15
    • 2023-02-14
    • 2015-01-29
    • 2021-10-14
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多