#r #shiny #warnings #suppress-warnings
#r #shiny #warnings #suppress-warnings
Вопрос:
Приведенный ниже блестящий код содержит 2 связанные матрицы; первая отображается на боковой панели как «Сценарий 1», а вторая отображается в модальном диалоговом окне после нажатия кнопки «Одно действие». Вторая матрица отражает Сценарий 1 из первой матрицы и позволяет пользователю как изменять этот Сценарий 1, так и добавлять другие сценарии. 2 Матрицы зеркально отражают друг друга по отношению к Сценарию 1, и последние элементы управления входными данными матрицы.
Чтобы получить матрицу 2, 2 матрицы по существу объединяются с размерами, соответствующими использованию cbind()
rbind()
функций и, как показано в приведенном ниже коде. Пробелы заполняются НА. Это прекрасно работает.
Однако при вводе любых сценариев, отличных от сценария 1, в матрицу 2 (как показано на рисунке внизу), закрытии диалогового окна матрицы 2 и последующем вызове его нажатием кнопки этого действия консоль rstudio отображает сообщение об ошибке «Предупреждение при принудительном(отмене списка(строка)) : NAs, введенный путем принуждения». Как мне подавить это предупреждение? Приложение работает правильно, и цель состоит в том, чтобы «принудить NAs» войти в объект.
Вы можете увидеть мои неудачные попытки использования suppressWarnings()
в приведенном ниже коде.
library(dplyr) library(ggplot2) library(shiny) library(shinyMatrix) sumMat lt;- function(x) {return(rep(sum(x, na.rm = TRUE), 10))} ui lt;- fluidPage(sidebarLayout( sidebarPanel( matrixInput( "matrix1", label = "Matrix 1:", value = matrix(c(60,5),ncol=2,dimnames=list(NULL,rep("Scenario 1",2))), rows = list(extend = TRUE, delete = TRUE), cols = list(multiheader = TRUE), class = "numeric" ), actionButton(inputId = "showMat2", "Add scenarios"),br(),br(), ), mainPanel(plotOutput("plot")) )) server lt;- function(input, output, session) { currentMat lt;- reactiveVal(isolate(input$matrix1)) observeEvent(input$matrix1, { tmpMat1 lt;- input$matrix1 if(any(rownames(input$matrix1)=="")){rownames(tmpMat1)lt;-paste("Row",seq_len(nrow(input$matrix1)))} updateMatrixInput(session, inputId = "matrix1", value = tmpMat1) tmpMat2 lt;- currentMat() suppressWarnings(if(nrow(tmpMat1) gt; nrow(tmpMat2)){tmpMat2 lt;- rbind(tmpMat2, rep(NA, ncol(tmpMat2)))}) suppressWarnings(if(nrow(tmpMat2) gt; nrow(tmpMat1)){tmpMat1 lt;- rbind(tmpMat1, rep(NA, ncol(tmpMat1)))}) suppressWarnings(currentMat(cbind(tmpMat1[drop=FALSE], tmpMat2[,-1:-2,drop=FALSE]))) }) observeEvent(input$showMat2, { showModal(modalDialog( matrixInput( "matrix2", label = "Matrix 2:", value = currentMat(), rows = list(extend = TRUE, delete = TRUE), cols = list(extend = TRUE,delta = 2,delete = TRUE,multiheader = TRUE), class = "numeric" ), footer = tagList(modalButton("Close")) )) }) observeEvent(input$matrix2, { tmpMat2 lt;- input$matrix2 rownames(tmpMat2) lt;- paste("Row", seq_len(nrow(input$matrix2))) colnames(tmpMat2) lt;- paste("Scenario", rep(1:ncol(tmpMat2),each = 2,length.out = ncol(tmpMat2))) suppressWarnings(currentMat(tmpMat2)) updateMatrixInput(session, inputId = "matrix2", value = tmpMat2) updateMatrixInput(session, inputId = "matrix1", value = tmpMat2[, 1:2, drop = FALSE]) }) plotData lt;- reactive({ tryCatch( lapply(seq_len(ncol(currentMat()) / 2), function(i) { tibble( Scenario = colnames(currentMat())[i * 2 - 1], X = seq_len(10), Y = sumMat(currentMat()[, (i * 2 - 1):(i * 2), drop = FALSE]) ) }) %gt;% bind_rows(), error = function(e) NULL ) }) output$plot lt;- renderPlot({ plotData() %gt;% ggplot() geom_line(aes( x = X, y = Y, colour = as.factor(Scenario) )) theme(legend.title = element_blank()) }) } shinyApp(ui, server)