tryCatch не перехватывает ошибку и пропускает аргумент ошибки
Я заметил ниже, ошибка не перехватывается должным образом tryCatch: он не печатает TRUE, и он не идет в браузер...
Может ли это быть ошибкой в функции tryCatch?
library(formattable)
df1 = structure(list(date = c("2018-12-19", "2018-12-19"),
imo = c(9453391, 9771298),
name = c("SFAKIA WAVE", "MEDI KYOTO"),
speed = c(10.3000001907349, 11.6999998092651),
destination = c("ZA DUR", "ZA RCB"),
subsize = c("Post Panamax", "Post Panamax"),
eta = c("2018-12-27 09:00:00", "2018-12-27 09:00:00"),
ToSAF = c(TRUE, TRUE)),
.Names = c("date", "imo", "name", "speed", "destination", "subsize", "eta", "ToSAF"),
row.names = c(NA, -2L),
class = "data.frame")
tryCatch(expr = {
L = list(formattable::area(row = 3) ~ formattable::formatter('span', style = x ~ formattable::style(display = 'block', 'border-radius' = '4px', 'padding-right' = '4px')))
formattable::formattable(df1, L)
},
error = function(e) {
print(TRUE)
browser()
}
)
2 ответа
Там нет ошибки при оценке выражения formattable::formattable(df1, L)
, Вы можете проверить, запустив:
L <- list(formattable::area(row = 3) ~ formattable::formatter('span', style = x ~ formattable::style(display = 'block', 'border-radius' = '4px', 'padding-right' = '4px')))
test <- try(formattable::formattable(df1, L))
class(test)
[1] "formattable" "data.frame"
В случае ошибки класс должен быть "try-error"
, Ошибка появляется при попытке print
вывод вашего выражения на консоль. Я думаю, что вы хотите:
L <- list(formattable::area(row = 3) ~ formattable::formatter('span', style = x ~ formattable::style(display = 'block', 'border-radius' = '4px', 'padding-right' = '4px')))
test <- formattable::formattable(df1, L)
tryCatch(expr = {
print(test)
},
error = function(e) {
print(TRUE)
browser()
}
)
Почему это происходит:
Это потому что expr
вы переходите к tryCatch()
на самом деле не вызывает ошибку. Вы можете легко воспроизвести:
result <- tryCatch(expr = {
L = list(formattable::area(row = 3) ~ formattable::formatter('span', style = x ~ formattable::style(display = 'block', 'border-radius' = '4px', 'padding-right' = '4px')))
formattable::formattable(df1, L)
},
error = function(e) {
print(TRUE)
browser()
}
)
str(result)
# Classes ‘formattable’ and 'data.frame': 2 obs. of 8 variables:
# $ date : chr "2018-12-19" "2018-12-19"
# $ imo : num 9453391 9771298
# $ name : chr "SFAKIA WAVE" "MEDI KYOTO"
# $ speed : num 10.3 11.7
# ...
Что на самом деле вызывает вашу ошибку, так это то, что при запуске tryCatch
, R попытается напечатать его результат, который вызывает ошибку:
print(result)
# Error in `[<-`(`*tmp*`, row, col, value = format(fv)) :
# subscript out of bounds
Как вы можете расследовать:
Вы также можете расследовать, запустив traceback()
после того, как вы запустите свой код, и вы увидите, откуда возникла проблема:
# 14: render_html_matrix.data.frame(x, formatters, digits)
# 13: render_html_matrix(x, formatters, digits)
# 12: format_table(list(date = c("2018-12-19", "2018-12-19"), imo = c(9453391,
# 9771298), name = c("SFAKIA WAVE", "MEDI KYOTO"), speed = c(10.3000001907349,
# 11.6999998092651), destination = c("ZA DUR", "ZA RCB"), subsize = c("Post Panamax",
# "Post Panamax"), eta = c("2018-12-27 09:00:00", "2018-12-27 09:00:00"
# ), ToSAF = c(TRUE, TRUE)), list(formattable::area(row = 3) ~
# formattable::formatter("span", style = x ~ formattable::style(display = "block",
# `border-radius` = "4px", `padding-right` = "4px"))),
# format = "html")
# 11: do.call(attrs$formatter, c(list(value), format_args))
# 10: format.formattable(x, format = list(format = "html"))
# 9: format(x, format = list(format = "html"))
# 8: gsub("th align=\"", "th class=\"text-", format(x, format = list(format = "html")),
# fixed = TRUE)
# 7: as.htmlwidget.formattable(x)
# 6: as.htmlwidget(x)
# 5: print(as.htmlwidget(x), ...)
# 4: print_formattable.data.frame(x, ...)
# 3: print_formattable(x, ...)
# 2: print.formattable(x)
# 1: function (x, ...)
# UseMethod("print")(x)
Как получить поведение, которое вы (вероятно) хотите:
Теперь решение вашей проблемы на самом деле зависит от вашего ожидаемого поведения. Предполагая, что вы хотите получить ошибку, на которую вы ссылаетесь в вопросе, просто включите print()
в вашем expr
:
tryCatch(expr = {
L = list(formattable::area(row = 3) ~ formattable::formatter('span', style = x ~ formattable::style(display = 'block', 'border-radius' = '4px', 'padding-right' = '4px')))
print(formattable::formattable(df1, L))
},
error = function(e) {
print(TRUE)
browser()
}
)
Теперь вы получаете:
# [1] TRUE
# Called from: value[[3L]](cond)
# Browse[1]>