我在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))
我应该隔离矩阵的所有元素吗?还有另一种方式吗?
任何帮助/建议都将受到高度赞赏!
干杯
答案 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))