R shiny - 编辑数据框并闪亮采用最后编辑的数字

R shiny - editing a data frame and shiny takes the last number edited

我有一个动态 UI 和 select 输入,以便 select 数据框的行和列,以及一个用于引入新数字的数字输入。当我更改一个数字并选择另一行后,shiny 会使用上次使用的数字更改新行的数字。

server.R

shinyServer(function(input, output) {

  output$select1 = renderUI(
    selectInput("contrato","Selecciona un codi", c(variables[,1],"Select"), "Select") )

  output$select2 = renderUI(
    if (is.null(input$contrato) || input$contrato == "Select"){
        return()
    }else{ 
        selectInput("variable", "Selecciona una variable", c(colnames(variables)[-1], "Select"), "Select")
  })

  output$select3 = renderUI(
    if (is.null(input$variable) || input$variable == "Select" ){
        return()
    }else{ 
      num <- variables[which(input$contrato == variables$garantias), which(input$variable == colnames(variables))]
      numericInput("var", "Modificar:", num)
    })

  result <- reactive({
    if(is.null(input$variable) || is.null(input$contrato) ) {
      return()
    } else {
    variables[which(input$contrato == variables$garantias), which(input$variable == colnames(variables))] <<- as.numeric(input$var)
    return(variables)
    }
  })

  output$View = renderTable({
    if(is.null(input$contrato) || is.null(input$variable) ) {
      return()
    } else {
      result()
    } 

  })
})

ui.R

shinyUI(fluidPage(
  titlePanel("Test"),

  sidebarLayout(
    sidebarPanel(
      uiOutput("select1"),
      uiOutput("select2"),
      uiOutput("select3")
    ),
    mainPanel(h3("Data frame: "),
              tableOutput("View"))
  )
))  

和数据框:

variables <- data.frame(garantias = c("C00", "C11", "C22", "C33"), c.retencio = rep(2,4), t.mort = rep(3,4), comi = rep(4,4), desp = rep(5,4), PB = rep(6,4))

非常感谢!

问题是该应用程序不知道您何时需要更改。例如,如果您想将同一列的两行更改为“4”,您要做的就是更改行号。但是 shiny 无法判断这是您在更改行号时想要执行的操作,还是您也打算更改列号。

处理此问题的一种方法是在 ui 中放置一个 actionButton,然后仅在按下按钮时更改值。因此,在 ui 中的 sidebarPanel 中的第 3 个 uiOutput 下方添加:

actionButton(inputId=modificar, label="Modifica") 

并在 server 中更改:

result <- reactive({
    input$modificar
    isolate({
      if(is.null(input$variable) || is.null(input$contrato) ) {
        return()
         } else {
         variables[which(input$contrato == variables$garantias),    
             which(input$variable == colnames(variables))] <<-  
             as.numeric(input$var)
         return(variables)
         }
   })
 })

这应该隔离对 variables 的更改,以便仅当用户点击按钮时才会发生这些更改。