Pergunta

Eu tenho uma função de exemplo abaixo que lê em uma data como uma string e a retorna como um objeto de data. Se lê uma string que não pode converter em uma data, ele retornará um erro.

testFunction <- function (date_in) {
    return(as.Date(date_in))
    }

testFunction("2010-04-06")  # this works fine
testFunction("foo")  # this returns an error

Agora, quero usar o Lapply e aplicar esta função em uma lista de datas:

dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction)  # this works fine

Mas se eu quiser aplicar a função em uma lista quando uma string no meio de duas boas datas retorna um erro, qual é a melhor maneira de lidar com isso?

dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)

Presumo que quero uma tentativa lá, mas existe uma maneira de pegar o erro para a string "foo" enquanto pede ao Lapply para continuar e ler o terceiro encontro?

Foi útil?

Solução

Use um tryCatch expressão em torno da função que pode lançar a mensagem de erro:

testFunction <- function (date_in) {
  return(tryCatch(as.Date(date_in), error=function(e) NULL))
}

A coisa legal sobre o tryCatch função é que você pode decidir o que fazer no caso de um erro (neste caso, retornar NULL).

> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"

[[2]]
NULL

[[3]]
[1] "2010-04-08"

Outras dicas

Pode -se tentar simplificar, em vez de complicá -lo:

  • Use a análise de data vetorizada
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"

Você pode envolver trivialmente na.omit() ou qualquer que seja ao seu redor. Ou encontre o índice de NAS e extraia de acordo com o vetor inicial, ou use o complemento do NAS para encontrar as datas analisadas, ou, ou, ou. Já está tudo aqui.

  • Você pode fazer o seu testFunction() faça alguma coisa. Use o teste lá - se a data de retorno (analisada) for Na, faça algo.

  • Adicione a tryCatch() bloco ou a try() até a sua data analisando.

As coisas todas são um pouco estranhas quando você passa de uma estrutura de dados de um tipo (vetor de chars) para outra coisa, mas você não pode misturar facilmente tipos, a menos que os mantenha em um list modelo. Então, talvez você precise repensar isso.

Assumindo o testFunction() não é trivial e/ou que não se pode alterá -lo, ele pode ser embrulhado em uma função própria, com um bloco trycatch (). Por exemplo:

> FaultTolerantTestFunction <- function(date_in) {
+    tryCatch({ret <- testFunction(date_in);}, error = function(e) {ret <<- NA});
+    ret
+ }
> FaultTolerantTestFunction('bozo')
[1] NA
> FaultTolerantTestFunction('2010-03-21')
[1] "2010-03-21"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top