Как выполнить отладку, если номер строки ошибки не указан? - PullRequest
4 голосов
/ 03 мая 2019

Я использую shiny и shinydashboard для создания панели мониторинга. Минимальные примеры кодов приведены ниже:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
    dashboardHeader(title = "test"),
    dashboardSidebar(
        sidebarMenu(
            menuItem(text = "Tab One",tabName = "tab1"),
            menuItem(text = "Tab Two",tabName = "tab2"),
            id = "sidebar"), # an extra comma here!
    ),
    dashboardBody()
)


server <- function(input,output){}


shinyApp(ui,server)

Когда я запускаю это приложение, появляется сообщение об ошибке:

Error in tag("section", list(...)) : argument is missing, with no default

Я знаю, что получил эту ошибку, потому что у меня есть лишняя запятая в конце строки 10. Но проблема в том, что:

У меня похожая ошибка в моем приложении, но приложение содержит более 20 различных R-файлов, получающих друг друга, и более 2000 строк кода. Я не могу просмотреть каждый файл и попытаться определить, где я поставил дополнительную запятую.

Мой вопрос:

Есть ли более простой способ позволить R напечатать сообщение об ошибке с номером строки и источником файла? Или есть лучший способ отладки такого рода ошибок, когда детали не предоставлены? Спасибо!


В идеале я хочу, чтобы сообщение об ошибке было примерно таким:

Error in source: <folder>/<file.R> 9:10: argument is missing, with no default
9:      menuItem(text = "Tab Two",tabName = "tab2"),
10:     id = "sidebar"), # an extra comma here!
                       ^

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Вы можете использовать source() вместо:

(Например, я изменил ваш код, поместив пользовательский интерфейс с ошибкой в ​​дополнительный файл uiFile.R.

enter image description here

и затем активируйте трассировку (см. Правую часть рисунка: Show Traceback).

Тогда вы увидите:

enter image description here

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

Для получения дополнительной информации о том, какдля отладки блестящих приложений эта страница очень полезна: https://shiny.rstudio.com/articles/debugging.html.

2 голосов
/ 03 мая 2019

Исходный файл, а не его запуск, и после возникновения ошибки запустите

traceback()

в консоли. Когда я делаю это на вашем простом примере, я вижу это:

> traceback()
11: tag("section", list(...))
10: tags$section(id = "sidebarItemExpanded", class = "sidebar", `data-disable` = if (disable) 1 else NULL, 
        list(...))
9: tag("aside", list(...))
8: tags$aside(id = "sidebarCollapsed", class = "main-sidebar", `data-collapsed` = dataValueString, 
       custom_css, tags$section(id = "sidebarItemExpanded", class = "sidebar", 
           `data-disable` = if (disable) 1 else NULL, list(...)))
7: dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", tabName = "tab1"), 
       menuItem(text = "Tab Two", tabName = "tab2"), id = "sidebar"), 
       )
6: tagAssert(sidebar, type = "aside", class = "main-sidebar")
5: dashboardPage(dashboardHeader(title = "test"), dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", 
       tabName = "tab1"), menuItem(text = "Tab Two", tabName = "tab2"), 
       id = "sidebar"), ), dashboardBody()) at .active-rstudio-document#4
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/.active-rstudio-document", echo = TRUE)

Обратите внимание, что выражение, помеченное 5:, содержит информацию о номере строки: .active-rstudio-document#4. Это файл, который RStudio сохранил перед поиском, а часть #4 говорит, что проблема в строке 4. Строка 4 - это большой вызов dashboardPage. Вы не получите более тонких деталей, если не разбиваете код на более мелкие выражения. Это будет действительно неестественно, и, надеюсь, не будет необходимости, но вы могли бы написать оригинал как

library(shiny)
library(shinydashboard)

header <- dashboardHeader(title = "test")
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem(text = "Tab One",tabName = "tab1"),
    menuItem(text = "Tab Two",tabName = "tab2"),
    id = "sidebar"), # an extra comma here!
)
body <- dashboardBody()
ui <- dashboardPage(
  header,
  sidebar,
  body
)

server <- function(input,output){}

shinyApp(ui,server)

Когда я это делаю, traceback() включает эту строку:

5: dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", tabName = "tab1"), 
       menuItem(text = "Tab Two", tabName = "tab2"), id = "sidebar"), 
       ) at .active-rstudio-document#5

, который говорит мне, откуда возникла проблема.

Отредактировано, чтобы добавить: Другой способ увидеть трассировку - запустить

options(error = recover)

перед поиском всего. Прогон умрет с дисплеем, подобным дисплею traceback(), но отформатирован по-другому. Это также позволяет вам исследовать переменные в каждом из фреймов оценки, что, вероятно, не полезно в этом примере, но иногда очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...