【问题标题】:R Shiny: Modify output values in a data frameR Shiny:修改数据框中的输出值
【发布时间】:2018-08-30 10:39:00
【问题描述】:

以下简单的闪亮应用显示存储在名为 sent 的 R 数据框中的单词及其情绪。

library(shiny)

sent <- data.frame(word=c('happy', 'sad', 'joy', 'upset'),
                   sentiment=c('positive', 'negative', 'positive', 'negative'),
                   stringsAsFactors = FALSE)


ui <- fluidPage(
  numericInput(inputId = 'num', label='', value=1, min=1, max=nrow(sent)),
  br(),
  h4("Word:"),
  textOutput('word'),
  br(),
  h4("Sentiment:"),
  textOutput('sentiment')
)

server <- function(input, output){
  output$word <- renderText({ sent$word[input$num] })
  output$sentiment <- renderText({ sent$sentiment[input$num] })
}

shinyApp(ui=ui, server=server)

我想通过两种方式修改:

(1) 我希望用户能够滚动浏览sent$word 列中的单词,而不是使用numericInput()

(2) 更重要的是,我希望用户能够修改与每个单词相关的情感值。理想情况下,这将是一个下拉菜单(带有“肯定”和“否定”作为选项),它将显示存储在 sent 中的该单词的当前情绪值,但可以由用户更改并在数据框。

有什么建议吗?

【问题讨论】:

  • 在闪亮的reactive变量上查看/谷歌..
  • 您可以使用selectizeInput() 代替numericInput() 来下拉选择单词

标签: r shiny shiny-reactivity


【解决方案1】:

这应该可以解决问题

 library(shiny)

 sent <- data.frame(word=c('happy', 'sad', 'joy', 'upset'),
                   sentiment=c('positive', 'negative', 'positive', 'negative'),
                   stringsAsFactors = FALSE)

 sent2 <- reactiveVal(sent)

 i <- 1
 i2 <- reactiveVal(i)

 ui <- fluidPage(
  uiOutput("wordSelect"),
  br(),
  h4("Word:"),
  textOutput('word'),
  br(),
  h4("Sentiment:"),
  textOutput('sentiment'),
  br(),
  uiOutput("change"),
  actionButton("go","Change")
)

 server <- function(input, output){

  output$wordSelect <- renderUI({
    selectizeInput(inputId = 'wrd', label='select word', choices=sent$word, selected=sent$word[i2()])
  })

  output$word <- renderText({ input$wrd })
  output$sentiment <- renderText({  sent$sentiment[which(sent2()$word==input$wrd)] })

 observeEvent(input$go, {
    out <- sent
    out$sentiment[which(sent$word==input$wrd)] <- input$newLabel
    sent <<- out
    sent2(out)
    i <<- which(sent$word==input$wrd)+1
    if(i > length(sent$word)) {
      i <<- i - 1
    }
    i2(i)
})

  output$change <- renderUI({
    radioButtons("newLabel", label="Change value", choices=c('positive','negative'), sent$sentiment[which(sent2()$word==input$wrd)])
  })

  }

shinyApp(ui=ui, server=server)

调整后的输出首先存储在名为 sent2() 的 reactiveVal 中。这是您在运行 Shiny 应用程序时查看 adjure 值所必需的。

selectizeInput() 用于滚动单词 (Q1)。

radioButtons() 用于选择positivenegative 值。默认值是当前应用于相应单词的任何值。

actionButton() 用于在需要时进行更改。

更新:我添加了sent &lt;&lt;- out,以便您的sent 数据框实际上得到更新。请注意,这将覆盖您之前存储在 sent 中的值。

更新:每次单击操作按钮时,当前选定单词的索引都会使用which() 确定。然后递增并存储在ii2() 中。新索引用于确定selectizeInput() 的默认值。这样,当没有手动选择单词时,您将滚动浏览所有选项。当手动选择一个单词时,您将继续从该单词开始递增。当到达最后一个单词时,该值不会进一步增加

【讨论】:

  • 感谢@MKBakker - 这很好用!另一个请求:当点击更改actionButton 时,是否可以自动移动到下一个单词(sent 中的行)?
  • @Miguel 现在更新了
  • 完美!谢谢。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多