下面的MWE代码按预期工作。然而,我如何到达这里似乎草率与shinyMatrix包函数,matrixInput
,重复3x和我试图将这些合并到自定义函数firstInput
和secondInput
。对于合并重复的功能,有没有推荐的最佳实践?或者为了可理解性/调试原因,最好消除我的firstInput
和secondInput
,而只使用较长的matrixInput
?
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)
下面是合并了原始文章中使用的各种matrixInput函数的MWE代码。希望这是可以理解的!至少它比原文更短。
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)