Ответ 1
Вы можете выполнить регистрацию на сервере с помощью комбинации logging
и shinyjs
.
install.packages("logging")
install.packages("shinyjs")
В вашем ui.R привяжите shinyjs
с помощью shinyjs::useShinyjs
:
library(shinyjs)
shinyUI(
fluidPage(
useShinyjs(),
# etc...
В вашем сервере .R добавьте logjs
в список обработчиков журналов:
library(magrittr)
library(shinyjs)
library(logging)
basicConfig()
options(shiny.error = function() {
logging::logerror(sys.calls() %>% as.character %>% paste(collapse = ", ")) })
shinyServer(function(input, output, session) {
printLogJs <- function(x, ...) {
logjs(x)
T
}
addHandler(printLogJs)
# etc...
Затем, чтобы напечатать что-нибудь, используйте loginfo
.
Другие советы
-
При запуске приложения локально, например, из RStudio, используйте
options(shiny.error = browser)
илиoptions(shiny.error = recover)
, чтобы идентифицировать источник ошибок. -
Поместите как можно больше бизнес-логики в пакеты и внешние скрипты. Unit-test, когда вы подозреваете, что они вызывают проблемы. Пакет
testthat
может помочь здесь. -
Если вы ожидаете, что переменная встретит определенные ограничения, добавьте утверждение. Например, если
x
должен бытьzoo
, поместитеassert_that(is.zoo(x))
в верхней части вашего реактивного. -
Остерегайтесь поведения по умолчанию
drop
. Входите в привычку указыватьdrop = F
, когда вы хотите, чтобы ваш результат былdata.frame
. -
Попробуйте минимизировать количество переменных (параметры, среда, кеширование, состояние пользовательского интерфейса и т.д.), от которых зависит единица кода. Слабо типизированные языки достаточно сложны, чтобы отлаживать уже!
-
Используйте подходящие классы S4 и S3 вместо необработанных R-структур, где это возможно.
-
dput
позволит вам исследовать внутреннюю структуру объектов и очень полезно при попытке воспроизвести ошибки вне приложения. -
Попробуйте выполнить отладку в интерактивной консоли, не используя
print
внутри приложения. Это позволит вам быстрее итерации. Если отладка вне приложения невозможна, попробуйте поместить вызовbrowser()
непосредственно перед кодом проблемы. -
Никогда не используйте
sapply
в неинтерактивном коде. С пустым выводом он не сможет вывести нужный тип и вернуть пустойlist
. Если ваш результат должен бытьvector
, используйтеvapply
. Если ваш результат должен бытьlist
, используйтеlapply
.
Вы также можете посмотреть Отладка блестящих приложений от команды RStudio.