Выполнение рекурсивной функции с использованием actionButton вызывает «ошибку: c использование стека» (блестящая) - PullRequest
0 голосов
/ 09 февраля 2020

Я создаю блестящее приложение, в котором пользователь может ввести матрицу, затем нажать кнопку воспроизведения, и оно постепенно применяет исключение Гаусса-Иордана. Ядром приложения является функция apply_gauss_jordan_3d, которая получает в качестве входных данных матрицу 3x3 A и I3, применяет Гаусс-Джордан за один шаг и возвращает список с измененными матрицами A 'и I'. Я хочу, чтобы функция renderTable выполнялась в двух сценариях ios: (1), когда пользователь изменяет матрицу ввода, и (2), когда пользователь нажимает кнопку действия. Вот упрощенная версия моего кода:


# Create user interface
ui <- fluidPage(
  theme = shinytheme("cerulean"),
  titlePanel(
    headerPanel("Linear Transformations")
  ),
  withMathJax(),
  sidebarLayout(
    sidebarPanel(
      radioButtons(
        "dimension", 
        label = "Choose number of dimensions", 
        choices = c("2D", "3D"), 
        selected = "2D"
      ),
      matrixInput(
        "transform_mat",
        label = "Input the transformation matrix",
        value = matrix(c(1, 0, 0, 1), nrow = 2, ncol = 2, byrow = FALSE),
        rows = list(names = FALSE),
        cols = list(names = FALSE),
        class = "numeric",
        copy = TRUE,
        paste = TRUE
      )
    ),
    mainPanel(
      tabsetPanel(
        type = "tabs",
        tabPanel("Plot",  plotlyOutput("plot")),
        tabPanel("Null Space", verbatimTextOutput("null_space"), plotlyOutput("null_space_plot")),
        tabPanel("Determinant", uiOutput("determinant")),
        tabPanel(
          "Gauss-Jordan", 
          tableOutput("gauss_matrix"), 
          tableOutput("gauss_identity"), 
          actionButton("rewind", "", icon = icon("fast-backward")),
          actionButton("play", "", icon = icon("play")),
          actionButton("advance", "", icon = icon("fast-forward"))
        )
      )
    )
  )
)


# Define server function
server <- function(input, output, session) {
  observeEvent(input$dimension, {
    mat_options <- list(
      "2D" = matrix(c(1, 0, 0, 1), nrow = 2, ncol = 2, byrow = FALSE),
      "3D" = matrix(c(1, 0, 0, 0, 1, 0, 0, 0, 1), nrow = 3, ncol = 3, byrow = FALSE)
    )
    updateMatrixInput(
      session, 
      "transform_mat", 
      value = mat_options[[input$dimension]]
    )
  })
  mat_list <- reactive(
    list(
      input$transform_mat,
      diag(as.numeric(str_remove(input$dimension, "D")))
    )
  )
  mat_list <- eventReactive(input$play, {
    apply_gauss_jordan_3d(mat_list()[[1]], mat_list()[[1]])
  })  
  output$gauss_matrix <- renderTable({
    mat_list()[[1]]
  }, colnames = FALSE)
  output$gauss_identity <- renderTable({
    mat_list()[[2]]
  }, colnames = FALSE)
}

# Run shiny application
shinyApp(ui, server)

Однако, когда я выполняю его, я получаю следующую ошибку:

Error in : C stack usage  7969216 is too close to the limit

Само вычисление совсем не дорого, но я думаю, это входит в бесконечную рекурсию как-то. Знаете ли вы, как я мог бы настроить его, чтобы избежать этой проблемы?

Приветствия

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