r - 如何使用 R Shiny 从绘图图中显示表中的多行并从表中删除最后一行?
问题描述
我正在尝试使用 plotly 绘制图形,其中人们单击 geom_points 并且它应该将该 geom_point 行填充到下面呈现的表格中。
我已经成功地做到了这一点。因此,Person 单击图形上的 geom_point,显示 geom_point 数据(行)。现在我试图将多行附加到同一个表中,而不是覆盖该人选择的前一行。基本上,我希望这个人应该点击多个 geom_points 并且表格应该显示所有 geom_points 数据而不是覆盖前一个。
library(shiny)
library(plotly)
library(DT)
d1=structure(list(Topic = c("compensation", "manager", "benefits",
"family", "communication", "worklifebalance", "perks", "compensation",
"benefits", "manager", "communication", "worklifebalance", "family",
"perks", "benefits", "compensation", "manager", "communication",
"family", "worklifebalance", "perks"),
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
.Label = c("Prct", "Count"), class = "factor"),
value = c(2.23121245555964, 0.723305136692411, 0.576192227534633,
0.202280250091946, 0.190020840995464, 0.153242613706019,
0.0122594090964816, 0.913705583756345, 0.609137055837563,
0.50761421319797, 0.50761421319797, 0.304568527918782, 0.203045685279188,
0, 1.49977276170277, 1.21193758521436, 0.893803969095592,
0.439327374640206, 0.348432055749129, 0.242387517042872,
0.0757460990758976),
group = c("APAC", "APAC", "APAC", "APAC", "APAC", "APAC", "APAC",
"EMEA", "EMEA", "EMEA", "EMEA", "EMEA", "EMEA", "EMEA",
"AMERICAS", "AMERICAS", "AMERICAS", "AMERICAS", "AMERICAS",
"AMERICAS", "AMERICAS")),
.Names = c("Topic", "variable", "value", "group"), class = c("data.table", "data.frame"),
row.names = c(NA, -21L))
ui <- fluidPage(
fluidRow(plotlyOutput('keywords')),
fluidRow(verbatimTextOutput("selection")),
fluidRow(DT::dataTableOutput("table1"))
)
d0 = d1
key <- row.names(d0)
server = function(input,output){
output$keywords = renderPlotly({
d0 <- data.frame(d0, key)
p = ggplot(d0, aes(reorder(Topic,-value), value, key = key)) +
geom_point(aes(colour = value),
shape = 16,
size = 3,
show.legend = F) +
facet_wrap(~ group)+
theme_minimal()
ggplotly(p)
})
output$selection <- renderPrint({
s <- event_data("plotly_click")
cat("You selected: \n\n")
data.frame(s)
})
selection2 <- reactive({
s <- event_data("plotly_click")
cat("You selected: \n\n")
df <- data.frame(s)
})
output$table1 = renderDT({
d2 <- d1 %>% filter(key == selection2()$key)
d2
})
}
shinyApp(ui, server)
如果您将运行此代码并单击点。您会注意到它会覆盖表中的行。我希望当您继续单击点时它应该继续附加行。我是使用闪亮的新手,但如果有办法使用 reactiveValues 或 observeEvent 或其他什么?
解决方案
您必须更新 的值,d2
以便您可以使用reactiveVal()
. 这是我在您的server
功能中所做的更改:
d2 <- reactiveVal(data.frame())
observeEvent(event_data("plotly_click"), {
d2Temp <- rbind(
d2(),
d1 %>% filter(key == selection2()$key)
)
d2(d2Temp)
})
output$table1 = renderDT({
d2()
})
首先,您必须d2
用空初始化反应值data.frame
。然后,观察"plotly_click"
并将新行绑定到旧行data.frame
。最后用 更新你reactiveVal
的值d2(d2Temp)
。
推荐阅读
- multithreading - TThread::Synchronize() > 读取表单组件属性时?
- java - 导出正在运行的 Java 虚拟机
- javascript - 如何使用 jQuery 滚动到元素?
- css - 如何将类应用于 svg onclick?
- android - 如何将侦听器添加到文本视图而不是在文本更改上调用方法。文本视图是卡片视图的一部分
- tensorflow - 如何使用 tf.metrics 计算多标签分类的准确率?
- cuda - 将两个 CUDA 内核合并为一个
- javascript - 在我选择一个值后,更改问题仍然存在
- python - 从 Tensorflow 1.8.0 升级到 1.11.0 后,在每个 epoch 记录 OutOfRangeError
- node.js - Node.js 使用 Streams 更新存储在 S3 上的文件