R有光泽:如何不更新server.r中创建的矩阵的所有输入元素(显然孤立不够)

时间:2014-03-09 00:36:33

标签: r shiny

我在server.R中创建一个矩阵,其元素是数字输入。 (这是因为此矩阵的大小取决于其他输入)。

但是,如果用户想要更改行名称,例如使用某些前面的输入,并重新生成矩阵(我使用actionButton和isolate()隔离其创建),则所有数字输入都将丢失。我知道这是由于Shiny的反应性质,但有没有办法解决这个问题呢?

这是一个场景(见下图)(也在下面的代码中提供):2个输入用于创建行名,2个用于创建列,用于提供带有4个数字输入的2X2矩阵。用户在第一行中插入值,然后决定更改第二行的名称。该表格将重新创建,所有数字输入都将丢失。

以下是代码:

ui = pageWithSidebar(

headerPanel("TEST"),

sidebarPanel(

helpText('These inputs create the rows of the matrix:'),
textInput('r1','','for row1'),
textInput('r2','','for row2'),

helpText('These inputs create the columns of the matrix:'),
textInput('c1','','for column1'),
textInput('c2','','for column2'),
hr(),
actionButton('create','create')
),

mainPanel(    
uiOutput('matrix'))
)

server = function(input,output){

output$matrix <- renderTable({

if (input$create == 0)
return()  

isolate({
## extract inputs
myRow_entries <- lapply(1:2, function(z) input[[paste0("r", z)]])

myCol_entries <- lapply(1:2, function(z) input[[paste0("c", z)]]) 

Row_entries <- unlist(c(do.call("c", myRow_entries)))

Col_entries <- unlist(c(do.call("c", myCol_entries)))
## End of extract inputs     

## create matrix with numeric inputs      
matrix_input <- list()

for(j in 1:2){

matrix_input[[j]] <- paste0("<input id='element",j,"_", 1:2,"' class='shiny-bound-input span6' type='number' value=''>")             
}

matrix <- data.frame(matrix_input) 

row.names(matrix) <- Row_entries
colnames(matrix) <- Col_entries
matrix
})
},sanitize.text.function = function(x) x)

}

runApp(list(ui=ui,server=server))

我应该隔离矩阵的所有元素吗?还有另一种方式吗?

任何帮助/建议都将受到高度赞赏!

干杯 enter image description here

1 个答案:

答案 0 :(得分:3)

即使每次单击按钮都重新生成数据框,您也可以通过“旧”输入值设置输入值。

我更改了你的循环并将值设置为前一个输入的值具有相同的id:value='", input[[paste0("element", i, "_", j)]]

ui = pageWithSidebar(

  headerPanel("TEST"),

  sidebarPanel(

    helpText('These inputs create the rows of the matrix:'),
    textInput('r1', '', 'for row1'),
    textInput('r2', '', 'for row2'),

    helpText('These inputs create the columns of the matrix:'),
    textInput('c1', '', 'for column1'),
    textInput('c2', '', 'for column2'),
    tags$hr(),
    actionButton('create','create')
  ),

  mainPanel(    
    uiOutput('matrix')
  )
)

server = function(input,output){

  output$matrix <- renderTable({

    if (input$create == 0)
      return()

    isolate({
      Row_entries <- sapply(1:2, function(z) input[[paste0("r", z)]])

      Col_entries <- sapply(1:2, function(z) input[[paste0("c", z)]])

      matrix <- data.frame()

      for (i in 1:2) {
        for (j in 1:2) {
          matrix[i,j] <- paste0("<input id='element", i, "_", j, "' class='shiny-bound-input span6' type='number' value='", input[[paste0("element", i, "_", j)]], "'>")            
        }
      }

      row.names(matrix) <- Row_entries
      colnames(matrix) <- Col_entries

      matrix

    })
  },sanitize.text.function = function(x) x)

}

runApp(list(ui = ui, server = server))