Добавить (несколько) значений во фрейм данных с помощью R shining

Я использую R Shiny в сочетании с ggplot для визуализации определенного набора данных. Я хочу, чтобы пользователь мог добавлять значения в этот набор данных. Я могу заставить свое приложение показать мне исходные данные + одну точку данных, но как только пользователь вводит новую точку, старая исчезает: данные, введенные пользователем, фактически не хранятся в моем фрейме данных.

Часть кода, который я использую (для простоты изменены имена переменных):

shinyServer(
  function(input, output) {     
    output$newPlot <- renderPlot({   
      input$addButton
      isolate({
        x <- as.numeric(input$x)
        y <- as.numeric(input$y)
        if (!is.na(y)) {
          data <- rbind(data, data.frame(x = x, y = y))

          # more code here

        }

        # more code here 

        plot <- myPlot(data)
        print(plot)

      })
    })
  }
)

Пользователь может указать значения x и y с помощью textInput, а затем отправить эти значения с помощью кнопки (actionButton). Каждый раз, когда пользователь нажимает «добавить», самые последние введенные значения x и y отображаются поверх исходных данных, но любые другие значения, введенные пользователем (в том же сеансе), теряются. Как мне сделать так, чтобы я блестяще помнил, что вводят мои пользователи, и рисовал все это?


person Marleen    schedule 17.10.2014    source источник
comment
Вы хотите, чтобы новые входные данные сохранялись постоянно (т.е. оставались там, если вы перезапустите блестящее приложение?) или только для сеанса?   -  person cdeterman    schedule 17.10.2014
comment
Только на сеанс.   -  person Marleen    schedule 17.10.2014


Ответы (1)


Я не могу воспроизвести конкретно ваш, учитывая предоставленный вами код, но, возможно, вам поможет пример. Вам нужна часть reactiveValues, это позволяет вам хранить набор данных и обновлять его на протяжении всего сеанса по своему усмотрению. Возможно, это поможет вам решить вашу проблему?

require(shiny)
data(iris)

runApp(
  list(
    ui = fluidPage(
      headerPanel('Adding Data'),
      sidebarPanel(
        textInput("species", label="Add a new species", value="Enter species"),
        numericInput("sepal.length", label="Add a new sepal length", value=""),
        numericInput("sepal.width", label="Add a new speal width", value=""),
        numericInput("petal.length", label="Add a new petal length", value=""),
        numericInput("petal.width", label="Add a new petal width", value=""),
        actionButton("addButton", "UPLOAD!")
      ),
      mainPanel(
        tableOutput("table"))
    ),

    server = function(input, output) {     
      # just a small part of iris for display
      iris_sample <- iris[sample(nrow(iris), 10),]
      row.names(iris_sample) <- NULL

      # The important part of reactiveValues()
      values <- reactiveValues()
      values$df <- iris_sample
      observe({

        # your action button condition
        if(input$addButton > 0) {
          # create the new line to be added from your inputs
          newLine <- isolate(c(input$sepal.length, input$sepal.width, input$petal.length, input$petal.width, input$species))
          # update your data
          # note the unlist of newLine, this prevents a bothersome warning message that the rbind will return regarding rownames because of using isolate.
          isolate(values$df <- rbind(as.matrix(values$df), unlist(newLine)))
        }
      })
      output$table <- renderTable({values$df}, include.rownames=F)
    }
  )
)
person cdeterman    schedule 17.10.2014
comment
Большое спасибо, это действительно помогло мне добиться желаемого эффекта. - person Marleen; 20.10.2014
comment
Это очень полезно и для меня. Однако я не смог справиться с некоторыми проблемами, которые я указываю в этой проблеме: table-in-shiny-when-we-already-h" title="еще одно продолжение, чтобы добавить значения в реактивную таблицу в блестящем, когда мы уже h">stackoverflow.com/questions/34930846/, если бы вы помогите мне, я буду так рад. - person can.u; 22.01.2016
comment
addData <- observe({... с observe вы не можете присвоить значение переменной. - person Stophface; 19.05.2016
comment
@Stophface спасибо, что указали на это. Я исправил это сейчас. В этом случае он работал нормально, но вы правы, что ничего не назначено, и этого не должно быть. - person cdeterman; 19.05.2016