我正在创建一个带有表单的应用程序,供用户填写详细信息,然后按“提交”按钮:之后会将一行添加到汇总输入数据的数据框中。每个条目都有一个唯一的标识符,例如。名称。
如果进行了新的提交,但是引用了相同的标识符,我想要一个弹出框警告用户他们将要覆盖原始数据。
使用从this帖子中获取的信息,我已经部分地管理了目标。代码按预期执行更新(在运行下面的示例中,这在print()命令中得到证明),但ui不会像我期望的那样更新。
下面我已经包含了一个最小的工作示例,如果有人输入(例如)b到“行名称:”字段,10进入“新值:”字段,然后单击“分配新值”,然后弹出框出现,但上面的数据表不会改变,而且它似乎改变了阴影。然后,如果你重复第二个命令,例如。 b,8,“分配新值”,然后格式化恢复正常,两个提交都被视为已生效。
如果有人能解释为什么会发生这种情况,以及如何让应用程序按预期运行(例如,在第一次按键点击后更新表格),我将非常感激。
此外,如果有人知道如何扩展这个以接受/拒绝更新,那就太好了!我的意思是,在弹出框中选择“你确定要更新第b行吗?”,以及选项是/否。
请注意,在下面的示例中,我使用了shinyjs :: alert的解决方案(请参阅上面引用的帖子中的评论),我之前尝试过使用大部分帖子中概述的方法,但遇到了同样的问题。
由于
library(shiny)
library(shinyjs)
library(DT)
ui <- fluidPage(
useShinyjs(),
dataTableOutput("DF_table"),
hr(),
fluidRow(
column(4,
textInput("rowName", "Row Name:", NULL) ),
column(4,
numericInput("newValue", "New Value:",NULL) ),
column(4,
actionButton("assignValue", label = h5("Assign New Value"), width = "100%" ) )
)
)
server <- function(input, output, session) {
rvs <- reactiveValues( DF = data.frame(name = c("a", "b", "c"), value = 1:3 ) )
observeEvent(input$assignValue,{
# Test if the supplied row name corresponds to a row of DF.
if(input$rowName %in% rvs$DF[,"name"] ){
# If it does, pop up box warns user that the supplied row is being over written.
shinyjs::alert(paste("Reassigning value of", input$rowName, sep=" ") )
# Over writes the value in the selected row, with the new value.
rvs$DF[match(input$rowName, rvs$DF[,"name"]), "value"] <- input$newValue
print(rvs$DF)
}
})
# Output data table.
output$DF_table <- renderDataTable(rvs$DF, rownames = FALSE)
}
runApp(list(ui = ui, server = server))