【问题标题】:R shiny app: How to address specific shinyBS buttons across several tabs?R Shiny 应用程序:如何跨多个选项卡处理特定的 ShinyBS 按钮?
【发布时间】:2017-02-03 23:06:17
【问题描述】:

我已经开始编写一个闪亮的应用程序。

我想要实现的是在一行中加载一个带有字符串的文本文件 - 像这样:

$ cat testdata.txt
hello world 

如果文本被加载,元音在数据框中设置为值 1,并使用 shinyBS 包突出显示。

我想要实现的是能够通过单击切换按钮来更改数据框中的值。可以切换按钮,但更改的值不会传输到数据框或绘图。

如何做到这一点?我希望问题很清楚,如果没有,请询​​问,我会尝试重新表述问题并使其更清楚。

这是ui.Rserver.R 的代码。

ui.R

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Test buttons"),
  sidebarPanel(
    fileInput('file1', 'Choose text file',
              accept=c('text',
                       'text/plain',
                       '.txt')),
    tags$hr()
    ),
  mainPanel(
    tabsetPanel(
      tabPanel("Home"),
      tabPanel("Loaded Text",
               br(),
               tableOutput("showOverview")),
      tabPanel("Text fields",
               br(),
               uiOutput("createButtons")),
      tabPanel("Plots",
               br(),
               plotOutput("showDistribution"))
    )
  )
))

server.R

library(shiny)
library(shinyBS)

shinyServer(function(input, output) {
  fileReadText <- reactive({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    uploadReadText <- read.table(inFile$datapath, sep = "|",
                                 stringsAsFactors = FALSE)
    df <- data.frame(V1 = unlist(strsplit(uploadReadText[1,], "")))
    df$V2 <- as.integer(grepl("[aeiou]", df$V1))
    df$V2 <- ifelse(df$V1 == " ", NA, df$V2)
    names(df) <- c("letter", "value")
    df
  })

  output$showOverview <- renderTable({
    data1 <- fileReadText()
    data1[c(1:10),]
  })

  output$createButtons <- renderUI({
    data1 <- fileReadText()
    listOfButtons = list()
    for (i in 1:length(data1$letter)) {
      buttonValue <- as.logical(data1$value[i])
      buttonDisabled = FALSE
      if (is.na(buttonValue)) {
        buttonValue = 0
        buttonDisabled = TRUE
      }
      listOfButtons <- list(listOfButtons,
                            bsButton(paste("button_", i, sep = ""),
                                     data1$letter[i],
                                     type = "toggle",
                                     value = as.logical(buttonValue),
                                     disabled = buttonDisabled))
    }
    listOfButtons

  })

  output$showDistribution <- renderPlot({
    data1 <- fileReadText()
    plot(data1$value)
  })    
})

【问题讨论】:

  • 您能否详细说明您真正想要做什么?
  • 如果我单击一个按钮(并且如果它被切换),它应该将数据框中的相应值设置为 1 并更新该位置的图。如果再次取消切换,则应将其设置为 0(在数据框和绘图中)。

标签: r shiny shinybs


【解决方案1】:

这可能不是最好的解决方案,但它确实有效!除了已经存在的反应式表达式之外,我还添加了一个额外的反应式值,以便该值的变化反映在表格和绘图中。 ui.R 与您的代码中的相同。这是修改后的服务器。R

library(shiny)
library(shinyBS)

shinyServer(function(input, output) {
  values <- reactiveValues()

  fileReadText <- reactive({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    uploadReadText <- read.table(inFile$datapath, sep = "|",
                                 stringsAsFactors = FALSE)
    df <- data.frame(V1 = unlist(strsplit(uploadReadText[1,], "")))
    df$V2 <- as.integer(grepl("[aeiou]", df$V1))
    df$V2 <- ifelse(df$V1 == " ", NA, df$V2)
    names(df) <- c("letter", "value")
    values$df <- df
    df
  })


  output$showOverview <- renderTable({
    fileReadText()
    data1 <-  values$df
    data1
  })

  makeObservers <- reactive({
    data1 <- fileReadText()
    lapply(1:(length(data1$letter)), function (x) {

      observeEvent(input[[paste0("button_", x)]], {
         values$df[x,2] <- as.integer(!values$df[x,2])
      })

    }) 
  })

  output$createButtons <- renderUI({
    data1 <-  fileReadText()
    listOfButtons <-list()
    for (i in 1:length(data1$letter)) {
      buttonValue <- as.logical(data1$value[i])
      buttonDisabled = FALSE
      if (is.na(buttonValue)) {
        buttonValue = 0
        buttonDisabled = TRUE
      }
      listOfButtons <- list(listOfButtons,
                            bsButton(paste("button_", i, sep = ""),
                                     data1$letter[i],
                                     type = "toggle",
                                     value = as.logical(buttonValue),
                                     disabled = buttonDisabled))
    }

    makeObservers()
    listOfButtons

  })

  output$showDistribution <- renderPlot({
    data1 <- values$df
    plot(data1$value)
  })


}) 

[编辑]:

我修改了代码,toggle 指的是 1,unggled 指的是 0。这是修改后的服务器代码:

library(shiny)
library(shinyBS)

shinyServer(function(input, output) {
  values <- reactiveValues()

  fileReadText <- reactive({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    uploadReadText <- read.table(inFile$datapath, sep = "|",
                                 stringsAsFactors = FALSE)
    df <- data.frame(V1 = unlist(strsplit(uploadReadText[1,], "")))
    df$V2 <- as.integer(grepl("[aeiou]", df$V1))
    df$V2 <- ifelse(df$V1 == " ", NA, df$V2)
    names(df) <- c("letter", "value")
    values$df <- df1
    df
  })


  output$showOverview <- renderTable({
    fileReadText()
    data1 <-  values$df
    data1
  })

  makeObservers <- reactive({
    data1 <- fileReadText()
    lapply(1:(length(data1$letter)), function (x) {

      observeEvent(input[[paste0("button_", x)]], {
    #I have modified the code here. So that the table shows the value of the button
        if(!is.na(values$df[x,2]))
        values$df[x,2] <- as.integer(input[[paste0("button_", x)]])
      })

    }) 
  })

  output$createButtons <- renderUI({
    data1 <-  fileReadText()
    listOfButtons <-list()
    for (i in 1:length(data1$letter)) {
      buttonValue <- as.logical(data1$value[i])
      buttonDisabled = FALSE
      if (is.na(buttonValue)) {
        buttonValue = 0
        buttonDisabled = TRUE
      }
      listOfButtons <- list(listOfButtons,
                            bsButton(paste("button_", i, sep = ""),
                                     data1$letter[i],
                                     type = "toggle",
                                     value = as.logical(buttonValue),
                                     disabled = buttonDisabled))
    }

    makeObservers()
    listOfButtons

  })

  output$showDistribution <- renderPlot({
    data1 <- values$df
    plot(data1$value)
  })


}) 

希望对你有帮助!

【讨论】:

  • 谢谢,帮了大忙。只有一件小事:切换按钮应设置为 1,而不是 0。我需要更改什么?从values$df[x,2] &lt;- as.integer(!values$df[x,2]) 行中删除! 并不能解决问题。
  • @raven 按钮中的值是基于数据框中的初始值。例如,对于最初未切换的“h”,该值为 1,当我们切换它时,该值变为 0。类似地,对于最初切换的“e”,该值为 0,因此当我们单击它时值变为“1”。如果我理解正确,您想要的是完全相反的条件。我的理解正确吗?
  • 是的,没错。切换应为 1,未切换应为 0。
  • 也是初始状态?
  • 是的,全局切换应该引用 1,未切换应该引用 0。
猜你喜欢
  • 2021-11-08
  • 2019-08-21
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2023-01-01
  • 2017-02-04
  • 2023-03-29
  • 2019-01-20
相关资源
最近更新 更多