“ for”循环中的InputID

时间:2019-12-09 11:19:25

标签: r loops shiny counter

我在R方面相当陌生,在R Shiny方面也很陌生,将不胜感激。

我正在尝试设计一个简单的计数器应用程序,在该应用程序中我将需要许多操作按钮。我想知道是否有可能将动作按钮的InputID组装成矩阵,以便在应用程序的“服务器”部分中创建一个循环,在其中我可以将特定的InputID称为矩阵元素。

最终目标是能够单击应用程序中的操作按钮,不仅可以在单击后将其值显示为标签,还可以将该值存储在矩阵中。我打算做几种不同的矩阵,这就是为什么我想创建一个循环来缩短代码的原因。

下面的代码是我到目前为止为展示我正在尝试的内容而做的,但是它不起作用。

a1_q1 <- 0
a1_q2 <- 0
a1_q3 <- 0
a1_q4 <- 0

a2_q1 <- 0
a2_q2 <- 0
a2_q3 <- 0
a2_q4 <- 0

v1 <- c(a1_q1,a1_q2,a1_q3,a1_q4)
v2 <- c(a2_q1,a2_q2,a2_q3,a2_q4)
ma <- rbind(v1,v2)

inputbuttons <- c("a","b","c","d","e","f","g","h")
minputbuttons <- matrix(inputbuttons,nrow = 2,ncol = 4)

ui <- fluidPage(
  navbarPage("Scouting",
             tabPanel("Attack",
                      navlistPanel(
                        tabPanel("A",
                                 sidebarPanel(
                                   tags$b("A matrix")
                                 ),
                                 mainPanel(
                                   tags$b("Quality: 1-4"),
                                   br(),
                                   actionButton(minputbuttons[1,1], a_q1,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[1,2], a_q2,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[1,3], a_q3,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[1,4], a_q4,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   br(),
                                   actionButton(minputbuttons[2,1], a_q1,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[2,2], a_q2,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[2,3], a_q3,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;"),
                                   actionButton(minputbuttons[2,4], a_q4,
                                                style = "width: 100px; height:100px; background-color:blue; color:white;")
                                 )
                        )
                      )
             )
  )
)


server <- function(input, output, session) {
  for (i in 1:2){
    for (j in 1:4){
      observeEvent(
        input$minputbuttons[i,j],
        ma[i,j] <<- ma[i,j] + 1,
        updateActionButton(session,minputbuttons[i,j],label = ma[i,j])
      )
    }
  }
}

shinyApp(server = server, ui = ui)

在此先感谢您的帮助! V〜

1 个答案:

答案 0 :(得分:0)

for循环在服务器端不适用于这种情况,您应该尝试使用lapply

library(shiny)
x <- letters
ui <- function(request){
    tagList(
        lapply(
            x, 
            function(x){
                actionButton(
                    inputId = x, 
                    label = x
                )
            }
        )   
    )
}

server <- function(
    input, 
    output, 
    session
){
    lapply(
        x,
        function(x){
            observeEvent( input[[x]] , {
                print(x)
            })
        }
    )

}

shinyApp(ui, server)