The MWE code below works as intended. However, how I got here seems sloppy with the shinyMatrix package function, matrixInput, repeated 3x and my attempt to consolidate these into custom functions firstInput and secondInput. Is there recommended best practice for consolidating repeated functions? Or is it better to eliminate my firstInput and secondInput and just use the longer matrixInput throughout for understandability/debugging reasons?
library(shiny)
library(shinyMatrix)
firstInput <- function(inputId,y){ # << y = y col default value of input matrix
matrixInput(inputId,
value = matrix(c(10,5), 1, 2, dimnames = list(c("1st input"),c("X and Y",""))),
rows = list(extend = FALSE, names = TRUE),
cols = list(
extend = FALSE,
names = TRUE,
editableNames = FALSE,
multiheader=TRUE
),
class = "numeric")}
secondInput <- function(inputId,y){ # << y = y col default value of input matrix
matrixInput(inputId,
value = matrix(c(10,y), 1, 2, dimnames = list(c("2nd input"),c(1,""))),
label = "Add, delete, or modify matrix parameters:",
rows = list(extend = FALSE, names = TRUE),
cols = list(
extend = TRUE,
delta = 2,
delete = TRUE,
names = TRUE,
editableNames = FALSE,
multiheader=TRUE
),
class = "numeric")}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("panel"),
actionButton("showSecond","Show 2nd input (modal)",width = "100%")
),
mainPanel(plotOutput("plot1"))
)
)
server <- function(input, output, session){
output$panel <- renderUI({firstInput("input1")})
observeEvent(input$showSecond,{
showModal(
modalDialog(
if(is.null(input$input2))
{secondInput("input2",input$input1[1,2])} else
{matrixInput("input2",
value = input$input2,
label = "Add, delete, or modify matrix parameters:",
rows = list(extend = FALSE, names = TRUE),
cols = list(
extend = TRUE,
delta = 2,
delete = TRUE,
names = TRUE,
editableNames = FALSE,
multiheader=TRUE
),
class = "numeric")
}, # closes else
footer = modalButton("Close")
))
})
observe({ # << Assign sequential col header to matrix based on groupings of two
req(input$input2)
mm <- input$input2
colnames(mm) <- trunc(1:ncol(mm)/2) 1
isolate(updateMatrixInput(session, "input2", mm))
})
output$secondInput <- renderUI({
req(input$input1)
secondInput("input2",input$input1[1,2])
})
outputOptions(output,"secondInput",suspendWhenHidden = FALSE)
output$plot1 <-renderPlot({
req(input$input1)
plot(rep(if(isTruthy(input$input2)){input$input2[1,2]} else {input$input1[1,2]}, times=10))
})
}
shinyApp(ui, server)
CodePudding user response:
Below is the MWE code with a consolidation of the various matrixInput functions used in the original post. I hope this is understandable! At least it's shorter than the original post.
library(shiny)
library(shinyMatrix)
###################################################################################################
# a = matrix to input into matrixInput d = delta # of columns when extending columns #
# b = variable for y column of input matrix e = user option to delete column #
# c = extend matrix columns (T/F) #
###################################################################################################
# matValues... feed into matrixInput as initial matrix; b parameter is for initial "Y" value
matValue1 <- function(b){matrix(c(10,b), 1, 2, dimnames = list(c("1st input"),c("X and Y","")))}
matValue2 <- function(b){matrix(c(10,b), 1, 2, dimnames = list(c("2nd input"),c(1,"")))}
myInput <- function(inputId,a,c,d,e){
matrixInput(inputId,
value = a,
rows = list(extend = FALSE, names = TRUE),
cols = list(extend = c,
delta = d,
delete = e,
names = TRUE,
editableNames = FALSE,
multiheader=TRUE),
class = "numeric")}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("panel"),
actionButton("showSecond","Show 2nd input (modal)",width = "100%")
),
mainPanel(plotOutput("plot1"))
)
)
server <- function(input, output, session){
output$panel <- renderUI({myInput("input1",matValue1(256),FALSE,1,FALSE)})
observeEvent(input$showSecond,{
showModal(
modalDialog(
if(is.null(input$input2))
{myInput("input2",matValue2(input$input1[1,2]),TRUE,2,TRUE)}
else {myInput("input2",input$input2,TRUE,2,TRUE)},
footer = modalButton("Close")
))
})
observe({ # << Assign sequential col header to matrix based on groupings of two
req(input$input2)
mm <- input$input2
colnames(mm) <- trunc(1:ncol(mm)/2) 1
isolate(updateMatrixInput(session, "input2", mm))
})
output$secondInput <- renderUI({
req(input$input1)
myInput("input2",matValue2(input$input1[1,2]),TRUE,2,TRUE)
})
outputOptions(output,"secondInput",suspendWhenHidden = FALSE)
output$plot1 <-renderPlot({
req(input$input1)
plot(rep(if(isTruthy(input$input2)){input$input2[1,2]} else {input$input1[1,2]}, times=10))
})
}
shinyApp(ui, server)
