rhandsontable & shiny:根据添加的列制作条件图

rhandsontable & shiny: make a conditional plot depending on added columns

我想在 shiny 中更新 table 后制作一个绘图 (ggplot),但我似乎无法让它工作 - 绘图没有出现。只有在为 x 和 y 创建列后,该图才会出现。理想情况下,点作为值出现在编辑到 table 中。下面是我扩展的一些可重现代码 ()。

library(rhandsontable)
library(tidyverse)

ui <- fluidPage(
  h2("The mtcars data"),
  rHandsontableOutput("mytable"),
  textInput('NewCol', 'Enter new column name'),
  radioButtons("type", "Column type:",
               c("Integer" = "integer",
                 "Floating point" = "numeric",
                 "Text" = "character")),
  actionButton("goButton", "Update Table"),
  plotOutput("plot")
)

server <- function(input, output) {

  # g <- reactiveValues(d=NULL) #define it ouside

  mydata <- mtcars[1:5,]
  output$mytable = renderRHandsontable(df())
  df <- eventReactive(input$goButton, {
    if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
      if (input$type == "integer") v1 <- integer(NROW(mydata))
      if (input$type == "numeric") v1 <- numeric(NROW(mydata))
      if (input$type == "character") v1 <- character(NROW(mydata))
      newcol <- data.frame(v1)
      names(newcol) <- input$NewCol
      mydata <<- cbind(mydata, newcol)
    }
    rhandsontable(mydata, stretchH = "all")
  }, ignoreNULL = FALSE)
  observe(if (!is.null(input$mytable)) mydata <<- hot_to_r(input$mytable))

  output$plot <- renderPlot({
    if (req(mydata$x) >= 0 & req(mydata$y) >= 0) 
      ggplot(mydata, aes(x=mydata$x,y=mydata$y)) +
        geom_point()
    # else if (req(mydata$x) = 0 & req(mydata$y) = 0) {
    #   print("empty")
    # }
  })  
}

shinyApp(ui,server)

我不确切知道这些函数是如何工作的(rhandsontablehot_to_r),但你想要做的似乎与经典的 reactiveValues 框架兼容,就像你的服务器代码:

r = reactiveValues(mydata=mtcars[1:5,])
  output$mytable = renderRHandsontable(df())
  df <- eventReactive(input$goButton, {
    if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
      if (input$type == "integer") v1 <- integer(NROW(r$mydata))
      if (input$type == "numeric") v1 <- numeric(NROW(r$mydata))
      if (input$type == "character") v1 <- character(NROW(r$mydata))
      newcol <- data.frame(v1)
      names(newcol) <- input$NewCol
      r$mydata <- cbind(r$mydata, newcol)
    }
    rhandsontable(r$mydata, stretchH = "all")
  }, ignoreNULL = FALSE)
  observe({if (!is.null(input$mytable)) r$mydata <- hot_to_r(input$mytable)})
  output$plot <- renderPlot({
    if(is.null(r$mydata$x) | is.null(r$mydata$y)) {return(NULL)}
      ggplot(r$mydata, aes(x=x,y=y)) +
      geom_point()})  }

估计比全局赋值安全,一般不推荐