R:如何不更新在server.R中创建的矩阵的所有输入元素(显然隔离不够)

R:如何不更新在server.R中创建的矩阵的所有输入元素(显然隔离不够),r,shiny,R,Shiny,我正在server.R中创建一个矩阵,其元素是数字输入。(这是因为该矩阵的大小取决于其他输入) 但是,如果用户希望更改行名称(例如使用前面的一些输入),并重新生成矩阵(我使用actionButton和isolate()隔离其创建),则所有数字输入都将丢失。我知道这是由于光泽的反应性,但有办法解决这个问题吗 下面是一个场景(请参见下图)(下面的代码中也提供了该场景):2个输入用于创建行名称,2个输入用于创建列,这给出了一个包含4个数字输入的2X2矩阵。用户在第一行中插入值,然后决定更改第二行的名称

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

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

下面是一个场景(请参见下图)(下面的代码中也提供了该场景):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))
ui=pageWithSidebar(
headerPanel(“测试”),
侧栏面板(
helpText('这些输入创建矩阵的行:'),
textInput('r1','row1'),
textInput('r2','row2'),
helpText('这些输入创建矩阵的列:'),
textInput('c1','column1',',
textInput('c2','2'列'),
hr(),
actionButton('create','create')
),
主面板(
uiOutput(‘矩阵’)
)
服务器=功能(输入、输出){

输出$matrix即使每次单击按钮时重新生成数据帧,您也可以通过“旧”输入值设置输入值

我更改了您的循环,并通过具有相同id的上一个输入的值来设置值:
value=',input[[paste0(“元素”,I,“,”,j)]

ui=pageWithSidebar(
headerPanel(“测试”),
侧栏面板(
helpText('这些输入创建矩阵的行:'),
textInput('r1','row1'),
textInput('r2','row2'),
helpText('这些输入创建矩阵的列:'),
textInput('c1','column1'的'',
textInput('c2','column2'),
标记$hr(),
actionButton('create','create')
),
主面板(
uiOutput('矩阵')
)
)
服务器=功能(输入、输出){

输出$matrix谢谢Julien!回答被接受,它工作得很好!你又一次救了我的命!我希望我能尽快报答Julien,如果我使用单选按钮/选择输入代替数字输入,你知道如何维护选择吗?我试着在“选择”参数上使用相同的技巧,但显然,自从应首先定义选项,并且没有值字段。(此外,如果您知道将radioButtons/selectInputs嵌入到数据框中的HTML语法(如上所述),那将很神奇?请参阅)
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))