如何将更新的列名从 HandsOnTable 传递到 Shiny 中的绘图?
How can I pass updated column names from HandsOnTable to a plot in Shiny?
我正在构建一个闪亮的应用程序,它将接收数字数据(以 "handsontable" 格式)并根据输入的数据制作箱线图。我想有一个选项来更改结果 "handsontable" 的列名称(如 "textInput")并将这些名称传递给绘图的 "x" 轴标签。虽然下面的代码可以很好地更改 table 中的名称,但我找不到将这些更新的列名称 ("colHeaders") 传递给绘图的解决方案。我非常感谢您的建议。非常感谢!
编辑:该应用程序还计算列均值并保存 PNG 但这不太可能与我的问题相关
library(shiny)
library(rhandsontable)
library(dplyr)
#UI
ui <- shinyUI(fluidPage(
titlePanel("Boxplot builder"),
textOutput('result'),
sidebarLayout(
sidebarPanel(
wellPanel(
plotOutput("plot")),
wellPanel(
h3("Build BoxPlot"),
actionButton("build", "Build")),
wellPanel(
h3("Export Plot"),
downloadButton('ExportPlot', 'Export as png')),
),
mainPanel(textInput("colnames", "Enter Column Names (separated by comma)",
value="", placeholder = "e.g. Var1, Var2, etc"),
h5(tags$b("Enter data")),
rHandsontableOutput('table'))
)))
rowNames <- c(sprintf("[%d]",seq(1:20)), "Means")
defaultDF <- data.frame(
row.names = rowNames,
A = rep(NA_integer_, nrow=21),
B = rep(NA_integer_, 21),
C = rep(NA_integer_, 21),
stringsAsFactors = FALSE)
#Server
server <- function(input, output, session)
({
values <- reactiveValues(data = defaultDF)
observe({
req(input$table)
DF <- hot_to_r(input$table)
DF[setdiff(rowNames, "Means"),]
DF["Means",] <- colMeans(DF[setdiff(rowNames, "Means"),], na.rm = TRUE)
values$data <- DF
})
output$table <- renderRHandsontable({
req(values$data)
rhandsontable(values$data, rowHeaderWidth = 100,
colHeaders=str_trim(unlist(strsplit(input$colnames,","))),) %>%
hot_row(nrow(values$data), readOnly = TRUE)
})
observeEvent(input$build, {
output$plot <- renderPlot({
boxplot(values$data)
})
})
#Export PNG
output$ExportPlot = downloadHandler(
filename = 'BoxPlot.png',
content = function(file) {
png(file)
boxplot(values$data)
dev.off()
})
})
shinyApp(ui = ui, server = server)
您可以将 names
添加到您的 boxplot
通话中:
boxplot(values$data, names = str_trim(unlist(strsplit(isolate(input$colnames),","))))
并提供来自 input$colnames
的列名(用逗号分隔后)。
如果您不想在更改名称时更新绘图,除非按下构建按钮,您可以添加 isolate
。
此外,您可以创建一个单独的 reactive
表达式来 returns 列名,例如:
my_col_names <- reactive({
str_trim(unlist(strsplit(isolate(input$colnames),",")))
})
然后调用 my_col_names()
而不是绘图,table,以及任何需要列名的地方,因此您无需重复此代码。请注意,如果在列名更改时应计算此表达式,则您可能不希望 isolate
。
我正在构建一个闪亮的应用程序,它将接收数字数据(以 "handsontable" 格式)并根据输入的数据制作箱线图。我想有一个选项来更改结果 "handsontable" 的列名称(如 "textInput")并将这些名称传递给绘图的 "x" 轴标签。虽然下面的代码可以很好地更改 table 中的名称,但我找不到将这些更新的列名称 ("colHeaders") 传递给绘图的解决方案。我非常感谢您的建议。非常感谢! 编辑:该应用程序还计算列均值并保存 PNG 但这不太可能与我的问题相关
library(shiny)
library(rhandsontable)
library(dplyr)
#UI
ui <- shinyUI(fluidPage(
titlePanel("Boxplot builder"),
textOutput('result'),
sidebarLayout(
sidebarPanel(
wellPanel(
plotOutput("plot")),
wellPanel(
h3("Build BoxPlot"),
actionButton("build", "Build")),
wellPanel(
h3("Export Plot"),
downloadButton('ExportPlot', 'Export as png')),
),
mainPanel(textInput("colnames", "Enter Column Names (separated by comma)",
value="", placeholder = "e.g. Var1, Var2, etc"),
h5(tags$b("Enter data")),
rHandsontableOutput('table'))
)))
rowNames <- c(sprintf("[%d]",seq(1:20)), "Means")
defaultDF <- data.frame(
row.names = rowNames,
A = rep(NA_integer_, nrow=21),
B = rep(NA_integer_, 21),
C = rep(NA_integer_, 21),
stringsAsFactors = FALSE)
#Server
server <- function(input, output, session)
({
values <- reactiveValues(data = defaultDF)
observe({
req(input$table)
DF <- hot_to_r(input$table)
DF[setdiff(rowNames, "Means"),]
DF["Means",] <- colMeans(DF[setdiff(rowNames, "Means"),], na.rm = TRUE)
values$data <- DF
})
output$table <- renderRHandsontable({
req(values$data)
rhandsontable(values$data, rowHeaderWidth = 100,
colHeaders=str_trim(unlist(strsplit(input$colnames,","))),) %>%
hot_row(nrow(values$data), readOnly = TRUE)
})
observeEvent(input$build, {
output$plot <- renderPlot({
boxplot(values$data)
})
})
#Export PNG
output$ExportPlot = downloadHandler(
filename = 'BoxPlot.png',
content = function(file) {
png(file)
boxplot(values$data)
dev.off()
})
})
shinyApp(ui = ui, server = server)
您可以将 names
添加到您的 boxplot
通话中:
boxplot(values$data, names = str_trim(unlist(strsplit(isolate(input$colnames),","))))
并提供来自 input$colnames
的列名(用逗号分隔后)。
如果您不想在更改名称时更新绘图,除非按下构建按钮,您可以添加 isolate
。
此外,您可以创建一个单独的 reactive
表达式来 returns 列名,例如:
my_col_names <- reactive({
str_trim(unlist(strsplit(isolate(input$colnames),",")))
})
然后调用 my_col_names()
而不是绘图,table,以及任何需要列名的地方,因此您无需重复此代码。请注意,如果在列名更改时应计算此表达式,则您可能不希望 isolate
。