r语言 - 如何将重复函数折叠成一个主函数?



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

最新更新