Я создаю блестящее приложение, в котором пользователь может ввести матрицу, затем нажать кнопку воспроизведения, и оно постепенно применяет исключение Гаусса-Иордана. Ядром приложения является функция 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
Само вычисление совсем не дорого, но я думаю, это входит в бесконечную рекурсию как-то. Знаете ли вы, как я мог бы настроить его, чтобы избежать этой проблемы?
Приветствия