tryCatch не перехватывает ошибку и пропускает аргумент ошибки - PullRequest
0 голосов
/ 20 декабря 2018

Я заметил ниже, ошибка не перехватывается должным образом 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 ]

0 голосов
/ 21 января 2019

Почему это происходит:

Это потому, что 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]> 
0 голосов
/ 21 января 2019

Нет ошибки при вычислении выражения 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()
  } 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...