【问题标题】:Shiny - renaming factors in reactive data frameShiny - 反应数据框中的重命名因子
【发布时间】:2016-04-10 12:31:54
【问题描述】:

我正在构建一个闪亮的应用程序来查询 SQL 数据库,以便用户可以 ggplot 数据。我希望用户能够手动重命名因素,但正在努力开始。这是我想做的一个例子:

ui.R

library(markdown)

shinyUI(fluidPage(
  titlePanel("Reactive factor label"),
  sidebarLayout(
    sidebarPanel(

      numericInput("wafer", label = h3("Input wafer ID:"), value = NULL),

      actionButton("do", "Search wafer"),
      textInput("text", label = h3("Factor name to change"), value = ""),
      textInput("text", label = h3("New factor name"), value = ""),
      actionButton("do2", "Change name")

       ),

    mainPanel(
      verbatimTextOutput("waf"), 
      verbatimTextOutput("que"), 
      verbatimTextOutput("pos"),
      dataTableOutput(outputId="tstat")
    )
  )
)
)

服务器.R

# Create example data

Name <- factor(c("Happy", "New", "Year"))
Id <- 1:3

dd <- data.frame(Id, Name)

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "dd", dd)
query <-  function(...) dbGetQuery(con, ...)

wq = data.frame()
sq = data.frame()


shinyServer(function(input, output){

  # create data frame to store reactive data set from query
  values <- reactiveValues()
  values$df <- data.frame()

  # Wait for user to search
  d <- eventReactive(input$do, { input$wafer })

  # Reactive SQL query
  a <- reactive({ paste0("Select * from dd where Id=",d()) })
  wq <- reactive({  query( a() ) })

  # Check outputs
  output$waf <- renderPrint(input$wafer)
  output$que <- renderPrint({ a() }) 
  output$pos <- renderPrint( wq()[1,1] )

  # observe d() so that data is not added until user presses action button  
  observe({
    if (!is.null(d())) {
      sq <- reactive({  query( a() ) })

      # add query to reactive data frame
      values$df <- rbind(isolate(values$df), sq())
    }
  })

  output$tstat <- renderDataTable({
    data <- values$df
  })

})

在静态 R 中,我通常会使用数据表来重命名因子,即:

DT <- data.table(df)
DT[Name=="Happy", Name:="Sad"]

但我不确定如何使用 reactiveValues 来解决这个问题,即 values$df

我已阅读此内容 (R shiny: How to get an reactive data frame updated each time pressing an actionButton without creating a new reactive data frame?)。这导致我尝试这样做,但它没有做任何事情(甚至没有错误):

observeEvent(input$do2, {
    DT <- data.table(values$df) 
    DT[Name == input$text1, Name := input$text2]
    values$df <- data.frame(values$df)

  })

也许有办法解决这个问题..也许有办法使用操作按钮将数据“锁定”为新的数据框,然后可以用来重命名?

很抱歉提出这么冗长的问题。我真正的应用程序更长更复杂。我已经尝试将其剥离。

【问题讨论】:

标签: r shiny


【解决方案1】:

您的方法可行,但您的应用存在一些问题。

ui.R 中,两个textInput 具有相同的id,它们需要不同,以便您可以在server.R 中引用它们。在您发布的observeEvent 中,您引用了input$text1input$text2,因此您应该将textInputsid 更改为text1text2

在您发布的observeEvent 中,最后一行应该是values$df &lt;- as.data.frame(DT),否则不会改变任何内容。

【讨论】:

  • 啊哈!愚蠢的错误!非常感谢。
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2017-01-17
  • 1970-01-01
相关资源
最近更新 更多