【问题标题】:Purr::map_df - how to not abort when error occurs?Purr::map_df - 发生错误时如何不中止?
【发布时间】:2020-11-13 08:59:38
【问题描述】:

我在 R 中工作,并使用 map_df 通过一个提取数据的函数来循环应用程序。

我循环浏览了大约 750 个应用程序,并且对于大多数应用程序它都有效。但有时 R 会抛出错误(维数不正确),并且循环中止。

我想知道是否有办法修改我的代码,以便在发生此类错误时循环不会中止?我想继续前进并继续使用有效的应用程序构建数据集。

library(pdftools)
library(tidyverse)
library(tesseract)
library(reshape2)

#Function to read data from pdf application

fyh_pdf <- function(pdf) {
  pdf <- pdftools::pdf_text(pdf)
  
  string <- paste0(pdf, collapse = "")
  
  steg1 <- str_extract_all(string, 
                           regex("(?<=Arbetslivets medverkan i utbildningens planering och genomförande).+?(?=Organisation och ledning av utbildningen)", 
                                 dotall = TRUE,ignore_case = TRUE))[[1]]
  
  steg2 <- str_match_all(steg1, regex("Organisationsnamn: *([^\\r\\n]+?)\\r\\n.*?Insatt: *([^\\r\\n]+?)\\r\\n.*?Medverkan planering: *([^\\r\\n]+?)\\r\\n.*?Uppskattat anställningsbehov: *([^\\r\\n]+?)\\r\\n.*?Andra rekryteringsvägar: *([^\\r\\n]+?)\\r\\n.*?LIA-platser: *([^\\r\\n]+?)\\r\\n.*?Medfinansiering: *([^\\r\\n]+?)\\r\\n.*?Status: *([^\\r\\n]+?)\\r\\n",
                                      dotall=T))[[1]][,-1] 
  
  df <- tibble(utbildning_namn = str_extract(string, regex("(?<=Utbildningens namn:\r\n).*")),
               utbildning_anordnare = str_extract(string, regex("(?<=Ansvarig utbildningsanordnare:\r\n).*")),
               ansökningsnummer = str_extract(string, regex("(?<=Ansökningsnummer:\r\n).*")),
               organisationsnamn=steg2[,1], insatt=steg2[,2], medverkan_planering=steg2[,3], uppskattat_anställningsbehov=steg2[,4],
               andra_rekryteringsvägar=steg2[,5], LIA_platser=steg2[,6], medfinansiering=steg2[,7], status=steg2[,8]) %>% 
    mutate(utbildning_namn = str_trim(utbildning_namn, side = "left"),
           utbildning_anordnare = str_trim(utbildning_anordnare, side = "left"),
           ansökningsnummer = str_trim(ansökningsnummer, side = "left"))
  
  return(df)
}

#Let's loop!

setwd("H:/R/YH_ANSÖKNINGAR/YH_2018/")
filenames <- list.files(path = "H:/R/YH_ANSÖKNINGAR/YH_2018/") %>% 
  str_subset(pattern="_Ans_")


df <- map_df(.x = filenames, ~fyh_pdf(pdf = .x))

【问题讨论】:

  • 看看purrr::safelypurrr::possibly

标签: r purrr


【解决方案1】:

下面是purrr::safely 的示例。如果您需要进一步的帮助,请提供可重现的示例。

library(purrr)

min5 <- function(x) {
  x - 5
}

df <- list(a = c(2,3,5,6),
     b = c('a','b'), # non numeric to cause error
     c = c(9,10,11,21))


map(df,min5) # doesnt run
#> Error in x - 5: non-numeric argument to binary operator

map(df,safely(min5))
#> $a
#> $a$result
#> [1] -3 -2  0  1
#> 
#> $a$error
#> NULL
#> 
#> 
#> $b
#> $b$result
#> NULL
#> 
#> $b$error
#> <simpleError in x - 5: non-numeric argument to binary operator>
#> 
#> 
#> $c
#> $c$result
#> [1]  4  5  6 16
#> 
#> $c$error
#> NULL

reprex package (v0.3.0) 于 2020 年 11 月 26 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 2013-01-30
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多