【问题标题】:for loop shiny variable assignment 2for循环闪亮变量赋值2
【发布时间】:2017-11-14 05:37:07
【问题描述】:

这篇文章是a previous post 的扩展,我不小心过度简化了我的示例代码来复制问题。我正在尝试根据用户在输入字段中选择的字段数量重复创建用于闪亮的变量。提供的答案非常合适,我希望对其进行扩展。上一篇文章的过度简化是使用 numericInput 来确定要生成的字段数,而实际上我需要计算从 selectInput 中选择了多少条目来确定要填充多少字段。然后我需要反复调用服务器中的那些生成字段来生成输出。下面是我尝试扩展此问题的示例代码。

my_letters <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
my_names <- c("Mary", "Joe", "John", "Steve", "Bob", "Linda", "Emily", "Kevin", "Michael", "Tom")
my_number <- as.character(1:10)
my_df <- data.frame(my_letters, my_names, my_number)

letter_choices <- as.character(unique(my_df$my_letters))

ui <- fluidPage(
  selectInput("num_selected", label = "Select Letters", choices = letter_choices, selected = "", multiple = TRUE, selectize = TRUE),
  uiOutput("condPanels")
)

server<-function(input,output,session){

  output$condPanels <- renderUI({
    # if selected value = 0 dont create a condPanel,...
    if(!nrow(input$num_selected)) return(NULL)
    tagList(
      lapply(1:nrow(input$num_selected), function(nr){
        conditionalPanel(
          condition = paste0("input.num_selected >= ", nr),
          textOutput(paste0("Name", nr), "Name"),
          textOutput(paste0("Number", nr), "Number")

        )
      })
    ) 
  })

  output$Name1 <- renderText({ as.character(my_df$my_names[1]) })
  output$Name2 <- renderText({ as.character(my_df$my_names[2]) })

  output$Number1 <- renderText({ as.character(my_df$my_number[1]) })
  output$Number2 <- renderText({ as.character(my_df$my_number[2]) })

}

shinyApp(ui=ui, server=server) 

【问题讨论】:

  • 所以你想要 textOutput() 而不是 textInput() ?那确实会有点不同;)所以也没有条件输入?
  • output$condPanels

标签: r shiny


【解决方案1】:

你可以在没有这样的条件面板的情况下做到这一点。输出可以通过output[["name"]] 定义,以防您还想要动态,..

my_letters <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
my_names <- c("Mary", "Joe", "John", "Steve", "Bob", "Linda", "Emily", "Kevin", "Michael", "Tom")
my_number <- as.character(1:10)
my_df <- data.frame(my_letters, my_names, my_number)
letter_choices <- as.character(unique(my_df$my_letters))


ui <- fluidPage(
  sidebarPanel(
    selectInput("num_selected", label = "Select Letters", choices = letter_choices, selected = "", multiple = TRUE, selectize = TRUE)    
  ),
  mainPanel(
    uiOutput("txt")
  )
)

server<-function(input,output,session){

  output$txt <- renderUI({
    amt <- length(input$num_selected)
    if(!amt) return(NULL)
    tagList(lapply(1:amt, function(nr){
        tagList(
          textOutput(paste0("Name", nr)),
          textOutput(paste0("Number", nr))
        )
      })
    )
  })

    # if selected value = 0 dont create a condPanel,...
  observe({
    amt <- length(input$num_selected)
    if(!amt) return(NULL)
    lapply(1:amt, function(nr){
        local({
          idx <- which(input$num_selected[nr] == my_df$my_letters)
          output[[paste0("Name", nr)]] <- renderText({ as.character(my_df$my_names[idx]) })
          output[[paste0("Number", nr)]] <- renderText({ as.character(my_df$my_number[idx]) })
        })
    }) 
  })

}

shinyApp(ui=ui, server=server)

【讨论】:

  • 我还有一些反应变量来过滤我的数据框,这些变量会根据类似信息过滤数据(我的实际数据不像我在这篇文章中创建的模拟数据那样整洁)。这些反应变量目前被命名为filteredData1、filteredData2等。我将如何迭代地定义它们?我已经像这样尝试过paste0("filteredData", idx) &lt;- reactive({ ... 知道为什么这不起作用以及可行的解决方案吗?
  • 当我尝试上面评论中的代码时,控制台中的错误引用了我尝试它的行,错误为Error in &lt;-: target of assignment expands to non-language object
  • 好的,但这仍然需要分配一个变量名,我有多个(filteredData1和filteredData2将同时用于在同一个闪亮页面上显示不同的数据集)所以如何当 paste0 不适用于变量赋值时,你会迭代地赋值吗?
  • 所以如果我理解正确的话,amt 是一个数字,表示用户选择了多少输入,idx 是函数当前正在处理的索引?那么如果amt = 4,idx 将等于 1、2、3 和 4?我之所以问,是因为我的 textOutputs 工作正常,但是在使用我的图部署您的解决方案时遇到了一些问题,所以我试图更好地理解代码的逻辑。
  • 我觉得idx 不仅仅是一个编号索引,我不明白
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多