如何创建可通过操作按钮更改的反应式排名列表?

问题描述 投票:0回答:1

我想创建一些当用户单击操作按钮时会增加的框。

我尝试创建一个计数器,将其初始化为 1 并将其链接到操作按钮。当我尝试使用计数器时,它给了我错误

library(shiny)
library(DT)
library(readr)
library(shinythemes)
library(shinydashboard)
library(sortable)

testdataset <- data.frame(A = runif(n=4, min=1, max=6),B = runif(n=4, min=1, max=6),C = runif(n=4, min=1, max=6))

ui <- dashboardPage(
  dashboardHeader(title = "ShinySem"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Insert data", tabName = "data"),
      menuItem("Choosing variables", tabName = "drag")
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "data",
              fileInput("infile","Insert your dataset in csv",accept = c(".csv","text/csv","text/comma-separated-values")),
              radioButtons("separator","Separator: ",choices = c(";",",",":"), selected=";",inline=TRUE),
              dataTableOutput("userfile")),
      tabItem(tabName = "drag",
              actionButton("addex","Add Latent Exogenous variable"),
              actionButton("adden","Add Latent Endogenous variable"),
              textOutput("ex"),
              uiOutput("bucket"))
    )
  )
)

server <- function(input,output,session){
  #Rendering data
  df_uploads <- reactive({
    data <- input$infile
    if (is.null(data))
      return(testdataset)
    df <- read.csv(data$datapath, header = TRUE,sep = input$separator)
    return(df)
  })
  output$userfile<- renderDataTable({
    df <- df_uploads()
    datatable(df)
  })
  #Render Bucket list and drag and drop
  output$bucket <- renderUI(
    do.call("bucket_list",args = c(
      list(header = "Drag and drop",
           group_name = "bucketlistgroup",
           orientation = "horizontal",
           add_rank_list(
             text = "dataset you have insert",
             labels = colnames(df_uploads()),
             input_id = "starting_variables")),
      rank_list_exogenous
    )))
    
  #Reactive action button exogenous
  counter <- reactiveVal(value = 1) #initializing
  observeEvent(input$addex, {
    newcounter <- counter() + 1 #adding one by clicking
    counter(newcounter)
  
 })
  #Reactive ranklist exogneous
  rank_list_exogenous <- lapply(1:counter,function(i){
    add_rank_list(
      text = "Latent Exogenous variable",
      labels = NULL,
      input_id = "Latent Exogenous variable"
    )})
  
  
  
}
  
  
shinyApp(ui, server)

如果我用特定的数字替换反应排名列表外源块中的“计数器”,它会很好地工作,所以我认为问题是计数器

r shiny jquery-ui-sortable
1个回答
0
投票

我通过修改反应排名列表的创建来解决问题,以便在反应块中使用计数器

server <- function(input,output,session){
  #Rendering data
  df_uploads <- reactive({
    data <- input$infile
    if (is.null(data))
      return(testdataset)
    df <- read.csv(data$datapath, header = TRUE,sep = input$separator)
    return(df)
  })
  output$userfile<- renderDataTable({
    df <- df_uploads()
    datatable(df)
  })
  #Render Bucket list and drag and drop
  output$bucket <- renderUI(
    do.call("bucket_list",args = c(
      list(header = "Drag and drop",
           group_name = "bucketlistgroup",
           orientation = "horizontal",
           add_rank_list(
             text = "dataset you have insert",
             labels = colnames(df_uploads()),
             input_id = "starting_variables")),
      lapply(1:counterex(), function(i) {
        add_rank_list(
          text = paste("Latent Exogenous variable", i),
          labels = NULL,
          input_id = paste0("Latent_Exogenous_variable", i)
        )
      }),
      lapply(1:counteren(), function(i){
        add_rank_list(
          text = paste("latent Endogenous variable", i),
          labels = NULL,
          input_id = paste0("Latent_Endogenous_variable", i)
        )
      })
    )))
  
  #Reactive action button exogenous
  counterex <- reactiveVal(value = 1) #initializing
  observeEvent(input$addex, {
    newcounterex <- counterex() + 1 #adding one by clicking
    counterex(newcounterex)
  })
  #Reactive action button endogenous
  counteren <- reactiveVal(value = 1) #initializing
  observeEvent(input$adden, {
    newcounteren <- counteren() + 1
    counteren(newcounteren)
  })
}


shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.