我正在开发一个闪亮的应用程序,它从文件中读取数据,并在应用程序上显示数据,还允许用户刷新数据。该应用程序工作正常,但当我用动作按钮“刷新”数据时,一些样式已经消失。
以下是我的app.R
library(shiny)
file_name <- "sample.csv"
bkg_color <- "red"
# Define UI for application
ui <- fluidPage(
actionButton("refresh", "", icon("refresh") ),
tableOutput("table"),
uiOutput("slider")
)
# Define server logic required
server <- function(input, output, session) {
observeEvent(input$refresh,{
source("updatedata.R")
showModal(modalDialog(
title = "",
"Data refreshed",
easyClose = TRUE,
footer = NULL
))
})
# observe the raw file, and refresh if there is change every 5 seconds
raw <- reactivePoll(5000, session,
checkFunc = function(){
if (file.exists(file_name))
file.info(file_name)$mtime[1]
else
""
},
valueFunc = function(){
read.csv(file_name)
})
output$table <- renderTable(raw())
output$slider <- renderUI({
req(raw())
tagList(
# styling slider bar
tags$style(HTML(paste0(".js-irs-0 .irs-single, .js-irs-0 .irs-bar-edge, .js-irs-0 .irs-bar {background: ",
bkg_color,";border-top: ",bkg_color,";border-bottom: ",bkg_color,"; border: ",bkg_color,"}"))),
sliderInput("date","",
min = min(raw()$v1),
max = max(raw()$v1),
value = max(raw()$v1))
)
})
}
# Run the application
shinyApp(ui = ui, server = server)
在上面,我使用renderUI
作为我的滑块,因为值取决于我从本地文件中读取的原始值。我明确指定滑块的颜色(当前设置为红色)。
在同一目录中,我updatedata.R
执行类似下面的操作:
file_name <- "sample.csv"
temp <- data.frame(v1 =runif(10, min = 0, max = 100), v2 = Sys.time() )
write.csv(x =temp, file = file_name,row.names = FALSE )
要运行示例应用程序而不出错,请先运行上面的代码来初始化csv文件。
当应用首次启动时,滑块为红色。但是,通过单击应用程序顶部的刷新按钮[不浏览器刷新]刷新基础数据后,滑块会更改回默认的闪亮应用颜色。
我已经搜索了相当长一段时间的答案,但是甚至无法弄清楚这是什么原因。有没有人之前遇到类似的问题,或者知道如何修复它,以便刷新后滑块的颜色不变?
谢谢!
答案 0 :(得分:1)
每次渲染新滑块时,Shiny都会递增滑块类。 因此初始类在刷新时变为.js-irs-1,然后是.js-irs-2等。
将您的css选择器更改为.irs d = [{'val': 454,'name': 'ss', 'name1': 'ff'},{'val': 'ss','name': 'ww', 'name1': 'ff'},{'val': 22, 'name': 'dd', 'name1': 'aa'}]
,如下所示:
def flatten(structure, key="", flattened=None):
if flattened is None:
flattened = {}
if type(structure) not in(dict, list):
flattened[key] = structure
elif isinstance(structure, list):
for i, item in enumerate(structure):
flatten(item, "%d" % i, flattened)
else:
for new_key, value in structure.items():
flatten(value, new_key, flattened)
return flattened
但是我建议使用服务器端逻辑来更新输入。这通常是更好的练习,因为html元素在网站上呈现,并且只更新某些值而不是整个元素。
检查child
功能以更新滑块