由反应数据制成的用户交互表

时间:2019-10-30 13:59:39

标签: r shiny reactive

我对Shiny非常陌生,并且努力理解反应性。

上下文:我希望用户为列选择一个名称,将此列添加到反应表中,然后编辑此表。该表是反应式的(来自用户过滤的上传文件)。

感谢this可以使用非反应性表(请参阅mydata <- mtcars[1:5,])来解决所有问题。 但是当mydata处于反应状态时,它就不起作用了!

以下是一个可复制的工作示例,其中包含来自@dww答案的非真实数据:

library(rhandsontable)

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

server <- function(input, output) {
  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))
}

shinyApp(ui,server)

我没有在代码内尝试这些更改(基本上我已经将mydata的所有mydata()都更改了):

server <- function(input, output) {

# mydata <- reactive({ }) #make mydata a reactive object

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

我发现this个问题答案/评论对回答我的问题没有帮助。

您能解释一下如何在@dww很棒的答案中使用反应式mydata吗?

[编辑:标题已更新,以更适合答案]

1 个答案:

答案 0 :(得分:1)

我修剪了一些额外的功能,例如列数据类型...作为一般规则-您将要呈现的任何内容都可以通过将其包装为“反应性”而变为反应性。下面我使用“ reactiveValues”,但其他反应性方法也可以使用。

一种使您的输出对数据输入的变化做出反应的通用方法-

foo_func = function() return(mydata)
foo_func_reactive = reactive(foo_func)
output$foo = renderMethod( foo_func_reactive() )

例如:

shinyApp(

ui = fluidPage(
  rHandsontableOutput("out_tbl"),
  textInput(inputId = "in_txt", label = "New column name"),
  actionButton(inputId = "in_btn1", label = "Add new column to the table above ..."),
  actionButton(inputId = "in_btn2", label = "... Or, generate new data")
),


server = function(input, output, session) {

  # establishes tbl_react as the holder for our reactive data, and pre-fills it for the first display with 1,2,3
  tbl_react <- reactiveValues(tbl = 
    data.frame(a = c(1,2,3))
  )

   # button one adds a new column with the inputted name
  observeEvent(input$in_btn1,{
    newcolname <- as.character(input$in_txt)
    newcol <- character(NROW(tbl_react$tbl))
    tbl_react$tbl <- cbind(tbl_react$tbl, newcol)
    colnames(tbl_react$tbl) <- c(colnames(tbl_react$tbl)[1:ncol(tbl_react$tbl)-1], newcolname)
  })

  # to show our output data is reactive, we can take a dependancy on button two to generate new data - this could instead be using an uploaded file
  observeEvent(input$in_btn2,{
    tbl_react$tbl <- data.frame(b = c(9,10,11))
  })


  output$out_tbl = renderRHandsontable( rhandsontable(tbl_react$tbl) )


  }
)