在shine中,我有两个表显示rhandsontable,我已经实现了,每当单元格值被更改时,单元格会被着色,但是当在表之间切换时,所有的更改都会消失,因为自然表每次从一开始重新加载,是否有可能以某种方式保存更改的单元格?所以只要你不退出会话或不按“重置”所有的更改保留,即使你在表之间切换?
(code基于以下线程的解决方案:in shiny: rhandsontable / afterChange, change multiple cell backgrounds at once)
library(shiny)
library(rhandsontable)
library(tidyverse)
change_hook <- "function(el,x) {
hot = this.hot;
cellchngs = [];
afterChange = function(changes, source) {
$.each(changes, function (index, elem) {
change = elem; /* gather the row, col, old, new values */
if(change[2] !== change[3]) { /* if old isn't the same as new */
cellchg = ({rowind: change[0], colind: change[1]});
cellchngs.push(cellchg); /* add row and column indicies to array */
}
});
$.each(cellchngs, function(ind, elem) {
td = hot.getCell(elem['rowind'], elem['colind']); /* get the html element */
td.style.background = 'cyan'; /* set background color */
});
}
hot.addHook('afterChange', afterChange); /* add event to table */
}"
ui <- div(actionButton(inputId = "reset_button",label = "Reset"), selectInput("data", "Choose data",choices=c("mtcars"=1, "iris"=2), selected=1)
,rHandsontableOutput(outputId="mtcars"))
server <- function(input, output, session) {
reset <- reactiveVal(0)
output$mtcars <- renderRHandsontable({
r = reset()
myvec <- c("mtcars", "iris")
mydata <- eval(parse(text=myvec[as.numeric(input$data)]))
rht = rhandsontable(mydata,reset=r,stretchH="all",height=300)
reset(0)
htmlwidgets::onRender(rht,change_hook)
})
observeEvent(input$reset_button,
{
reset(1)
})
}
shinyApp(ui, server)
2条答案
按热度按时间dly7yett1#
您可以使用隐藏的tabsetPanels来实现这一点。
请注意,我没有更改
change_hook
块。pjngdqdw2#
这是一个有点丑陋(在编码冗余方面)...但我累了,它的工作。在我的回答的最后,我再次提供了所有的代码,所有在一起,更容易复制+粘贴。
这利用了浏览器的 * 会话存储 *。这意味着只要是一个连续的事件,数据就会保存。如果您希望能够关闭浏览器或重新运行应用程序,并且仍然保留保存的更改,则可以使用本地存储(
sessionStorage
与localStorage
)。这将只适用于您现在已设置的图表。如果您将
ui
更改为具有两个单独的表,则这将无法工作。(如果你设置得不一样,我可以帮你,只要让我知道就行了。)对
change_hook
的修改:wh
将从selectInput
下拉菜单中捕获mtcars
或iris
。cellchngs
将像以前一样捕获更改,但现在每个表都有一个。有三个数组,因为它是最简单的方式来对齐1...在R中索引和0,1…JS中的索引换句话说,cellchngs
中的第一个数组将保持为空,下一个数组(JS中的索引1)将捕获selectInput
value = 1
中的所有更改-这就是您的mtcars
表(正如您所分配的那样)。afterChange
与您最初的问题没有太大变化。idx
以捕获selectInput
中的索引cellchngs =
修改为cellchngs[idx] =
sCookie()
:将数据保存在浏览器的会话存储中的函数(请参阅此更改列表后的图像)chgs
添加了全局var集合(这是在您的ui
中声明的;当我介绍对ui
的更改时,将对此进行详细介绍)if(sessionStorage...
查看是否有数据保存在会话存储中,如果有,这将更新表以反映自您启动浏览器会话以来所做的更改(无论您使用下拉菜单在表之间翻转多少次)查看会话存储:你可以在你的浏览器开发工具中看到这一点;选项卡:* 应用程序 ,左侧菜单: 会话存储 * ->您的IP(见下图)
修改
ui
我已经在你的
ui
中添加了一个tags$script
元素,你原来在ui
中的代码保持不变。在此脚本中,您将找到全局变量
chgs
的声明,即函数colr
:在change事件之外更改单元格颜色,以及sCookie
:将数据保存到会话存储器。全部代码
又来了,但都是一次性的。如果你有任何问题,让我知道。
请注意,我并没有在
server
中更改任何内容(尽管由于间距的原因,它看起来可能会有所不同)。