1

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

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)
4

1 回答 1

1

我不确切知道这些函数是如何工作的(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()})  }

我想这比做全局分配更安全,一般不推荐

于 2018-05-31T20:35:55.923 回答