首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将更新后的列名从HandsOnTable传递到Shiny中的绘图?

如何将更新后的列名从HandsOnTable传递到Shiny中的绘图?
EN

Stack Overflow用户
提问于 2020-06-13 21:18:32
回答 1查看 233关注 0票数 1

我正在构建一个闪亮的应用程序,它将接受数字数据(以"handsontable“格式),并在输入的数据中制作一个框图。我希望有一个选项来更改结果"handsontable“的列名(如"textInput"),并将这些名称传递给绘图的"x”轴标签。虽然下面的代码可以很好地更改表中的名称,但我找不到一种解决方案来将那些更新后的列名("colHeaders")传递给绘图。我非常感谢你的一条建议。非常感谢!编辑:应用程序还会计算列平均值并保存PNG,但这不太可能与我的问题有关

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 22:35:08

您可以在boxplot调用中添加names

代码语言:javascript
运行
复制
boxplot(values$data, names = str_trim(unlist(strsplit(isolate(input$colnames),","))))

并提供input$colnames中的列名(在用逗号拆分之后)。

如果不希望在更改名称时更新绘图,则可以添加isolate,除非按下build按钮。

此外,您还可以创建一个返回列名的单独reactive表达式,例如:

代码语言:javascript
运行
复制
my_col_names <- reactive({
  str_trim(unlist(strsplit(isolate(input$colnames),",")))
})

然后从plot、table和任何需要列名的地方调用my_col_names(),这样就不需要重复这段代码了。请注意,如果应该在列名更改时计算此表达式,则可能不希望使用isolate

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62360306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档