【发布时间】: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)
})
也许有办法解决这个问题..也许有办法使用操作按钮将数据“锁定”为新的数据框,然后可以用来重命名?
很抱歉提出这么冗长的问题。我真正的应用程序更长更复杂。我已经尝试将其剥离。
【问题讨论】:
-
可能相关:stackoverflow.com/q/20201070/2679518 如果您的
data.frame本身是一个反应性对象,您将无法更改data.frame本身的名称。