Подтвердить что ты не робот

Эффективная отладка блестящих приложений

У меня есть сложное приложение Shiny, распространяемое по нескольким файлам, использующим код из нескольких пакетов. Приложение работает, когда выполняется локально в R Studio, но на моем сервере он генерирует общую ошибку:

Ошибка: не знаю, как преобразовать 'x' в класс "Дата"

Это, вероятно, простая ошибка программирования, но выяснить, где именно ошибка в коде, оказывается сложной.

Как я могу выследить и исправить исходный код ошибок в блестящих приложениях? И какие инструменты доступны для этого систематически?


Обсуждались подобные проблемы на Группы Google.

4b9b3361

Ответ 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.

Ответ 2

Я удивлен, что статья об отладке RStudio Shiny не упоминается. Эта статья очень тщательна в отладке и обработке ошибок.

Вы можете проверить журнал своего сервера, который должен решить вопрос, заданный OP более непосредственно.

Ответ 3

Дата выпуска: Серверная сторона может использовать другую операционную систему с другой кодировкой набора символов по умолчанию (например, "latin1", "utf-8" ). Иногда загрузка данных в R теряет кодировку. Функция read.csv имеет параметр encoding = "UTF-8", который вы могли бы использовать.

Чтобы отлаживать, я полагался на заявления печати. Мне также интересно узнать, нашли ли другие методы более систематично.