R 如何从数据表单元格单击中观察动态生成的UI?
要编辑一对多相似的数据结构R 如何从数据表单元格单击中观察动态生成的UI?,r,shiny,R,Shiny,要编辑一对多相似的数据结构 我想创建一个数据表(DTOutput),在该表上我观察单元格单击observeEvent(输入$groupingout\u cell\u clicked,{…}) 然后,每次单击单元格时,我都希望在UI上生成输入字段 最后,我想听听那些呈现/生成的UI上的更改 我不能直接在DTOutput中编辑这些单元格,因为它不支持单元格内的向量。(因此,一对多关系) 我已经完成了第1步和第2步。我可以使用相应的单元格渲染DTOutput。我可以观察单元格单击并在单元格单击时插入U
DTOutput
),在该表上我观察单元格单击observeEvent(输入$groupingout\u cell\u clicked,{…})
insertUI()
)。我创建了observeEvent对象来观察这些渲染字段。但是,这些observeEvents在编辑新生成的字段时从不触发
ui = fluidPage(title = titlePanel("Title"),
tags$head(tags$style(HTML("hr {border-top: 1px solid #000000;}"))),
sidebarLayout(
sidebarPanel(),
mainPanel(tabsetPanel(type = "tabs",
tabPanel("Groupings", DTOutput(outputId = "groupingsOut"),
tags$div(id = 'placeholder')),
tabPanel("Test", textOutput(outputId = "statusOut")),
tabPanel("Plot Generator", plotOutput(outputId = "distPlotOut")))
)
)
)
server = function(input, output) {
# Label reactive values
labelRVs = list()
#Example table
groupings = data.frame(names = c("cars", "mbikes", "bikes"),
labels = c("Cars", "Motor Bikes", "Bikes"),
groups = I(list(c("toyota", "vw", "tesla"), c("harley", "kawasaki"), c("somth", "anoth", "bla"))),
groupLabels = I(list(c("Toyota", "VW", "Tesla"), c("Harley Davidson", "Kawasaki"), c("Something", "Another Thing", "Bla bla"))))
#groupings = data.frame()
proxy = dataTableProxy('groupingsOut')
observeEvent(input$groupingsOut_cell_clicked, {
info = input$groupingsOut_cell_clicked
if(!is.null(info$row)){
grouping = groupings[[info$row, 1]]
groupingLabel = groupings[[info$row, 2]]
groups = groupings[[info$row, 3]]
groupLabels = groupings[[info$row, 4]]
# remove previously generated UI
removeUI(selector = paste0('#placeholder input'), multiple = TRUE)
removeUI(selector = paste0('#placeholder label'), multiple = TRUE)
# Generating ID for grouping labels
id = paste0("groupLabel_", i)
# Inserting text input for grouping label
insertUI(selector = '#placeholder', ui = textInput(id, label = "Grouping label:", value = groupingLabel))
labelRVs[[id]] <<- observeEvent(id, {
cat(paste(id, i, "\n")) # THIS LINE ONLY RUNS AT INITIALIZATION :(
})
lapply(1:length(groups), function(i){
index = sprintf("%03d", i)
id = paste0('label_', index)
insertUI(selector = '#placeholder',
ui = textInput(id, label = paste0("Group label for ", groups[i], ":"), value = groupLabels[i]))
labelRVs[[id]] <<- observeEvent(id, {
cat(paste(id, i, "\n")) # ALSO THIS LINE ONLY RUNS AT INITIALIZATION :(
})
})
}
})
output$groupingsOut = renderDT(groupings[, c(1, 3)], rownames = FALSE, editable = TRUE, selection = 'single')
}
shinyApp(ui = ui, server = server)
ui=fluidPage(title=titlePanel(“title”),
标签$head(标签$style(HTML(“hr{border top:1px solid#000000;}”)),
侧边栏布局(
侧边栏面板(),
主面板(tabsetPanel(type=“tabs”,
选项卡面板(“分组”,DTOutput(outputId=“groupingsOut”),
标记$div(id='占位符'),
选项卡面板(“测试”,文本输出(outputId=“statusOut”),
选项卡面板(“打印生成器”,plotOutput(outputId=“distPlotOut”))
)
)
)
服务器=功能(输入、输出){
#标记反应值
labelRVs=list()
#示例表
groupings=data.frame(name=c(“汽车”、“摩托车”、“自行车”),
标签=c(“汽车”、“摩托车”、“自行车”),
组=I(列表(c(“丰田”、“大众”、“特斯拉”)、c(“哈雷”、“川崎”)、c(“somth”、“anoth”、“bla”)),
groupLabels=I(列表(c(“丰田”、“大众”、“特斯拉”)、c(“哈雷戴维森”、“川崎”)、c(“某物”、“另一物”、“布拉布拉”))
#groupings=data.frame()
proxy=dataTableProxy('GroupingOut')
observeEvent(输入$GroupingOut\u单元格\u单击{
信息=输入$GroupingOut\u单元格\u单击
如果(!为.null(info$行)){
分组=分组[[info$行,1]]
groupingLabel=分组[[info$行,2]]
分组=分组[[info$行,3]]
groupLabels=分组[[info$行,4]]
#删除以前生成的UI
removeUI(选择器=paste0(“#占位符输入”),多个=TRUE)
removeUI(选择器=paste0(“#占位符标签”),多个=TRUE)
#为分组标签生成ID
id=paste0(“组标签”,i)
#为分组标签插入文本输入
insertUI(选择器='#占位符',ui=textInput(id,label=“分组标签:”,value=groupingLabel))
labelRVs[[id]]我还没有理解你的代码,但是id
不是一个输入,你应该做input[[id]]
而不是observeEvent
@StéphaneLaurent啊,你说得对!就是这样。我以前确实试过,但失败了(可能是因为其他原因)。你愿意提供一个答案让我接受吗?我还没有理解你的代码,但是id
不是一个输入,你应该做input[[id]]
而不是observeEvent
中的id
@StéphaneLaurent啊,你是对的!就是这样。我以前确实尝试过,但失败了(可能是因为其他原因)。您愿意提供一个答案让我接受吗?