- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我每天通过 cron 作业为我的 Shiny 应用程序更新我的 RData 文件。但是, Shiny 的应用程序大多数时候不会选择更新,并继续显示旧 RData 文件中的旧数据。
这是最小的可重现示例。当从我的桌面执行 data_processing.R 时,它工作正常。然而,当它在 Rshiny 服务器上完成时,shiny 应用程序不会读取更新的日期和时间戳。
data_processing.R
rm(list=ls())
df <- iris
data_update_date_time <- Sys.time()
save.image("working_dataset.RData", compress = TRUE)
服务器.R
load("working_dataset.RData")
function(input, output, session) {
# Combine the selected variables into a new data frame
selectedData <- reactive({
df[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selectedData(), input$clusters)
})
output$plot1 <- renderPlot({
palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3",
"#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"))
par(mar = c(5.1, 4.1, 0, 1))
plot(selectedData(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
## Data update date and time stamp
output$update_date_time <- renderPrint(data_update_date_time)
}
ui.R
pageWithSidebar(
headerPanel('Iris k-means clustering'),
sidebarPanel(
selectInput('xcol', 'X Variable', names(iris)),
selectInput('ycol', 'Y Variable', names(iris),
selected=names(iris)[[2]]),
numericInput('clusters', 'Cluster count', 3,
min = 1, max = 9),
br(),
h4("Date update date time"),
textOutput("update_date_time")
),
mainPanel(
plotOutput('plot1')
)
)
感谢您抽出时间。
最佳答案
实际上,shiny
包中有一个名为 reactiveFileReader
的函数,它完全可以满足您的需求:定期检查文件“上次修改”时间或大小是否发生变化并相应地重读。但是,此函数只能在服务器
上下文中使用,因此对于连接到您的应用的每个用户,该文件至少会被读取一次。我的答案中的选项 3 和 4 没有这些低效问题。
首先,Shiny 没有办法跟踪文件更改 AFAIK。您的实现每当
时都会重新加载.RData
文件
shiny-server
通过 bash 重新启动无法判断何时满足第二个条件。因此,我建议使用以下四个选项之一。从简单到你最好了解你的 Shiny !排序。
在这里,每当新用户连接应用程序时,都会重新加载图像。但是,如果您的 .RData
文件很大,这可能会减慢您的应用程序的速度。如果速度不是问题,我会选择这个解决方案,因为它简单且干净。
# server.R
function(input, output, session) {
load("working_dataset.RData")
...
}
每当用户刷新页面(F5)时,数据也会被重新读取
(另请参阅@shosacos 答案)。这会强制重新加载 .Rdata
文件。
$ sudo systemctl restart shiny-server
同样,这可能会减慢您的生产过程,具体取决于应用程序的复杂性。这种方法的一个优点是,如果您在 global.R
中加载数据,您还可以使用导入的数据来构建 ui。 (我假设您没有给出您所提供的代码)。
这里的想法是在用户连接到应用时检查 .RData
是否已更改。为此,您必须使用包含上次导入版本的时间戳的“全局”变量。以下代码未经测试,但应该可以让您了解如何实现此功能。
# server.R
last_importet_timestamp <- reactiveVal("")
function(input,output,session){
current_timestamp <- file.info(rdata_path)$mtime
if(last_importet_timestamp() != current_timestamp){
# use parent.frame(2) to make data available in other sessions
load(rdata_path, envir = parent.fame(2))
# update last_importet_timestamp
last_importet_timestamp(current_timestamp)
}
...
}
就速度而言,这应该比前两个版本更高效。每个时间戳导入数据的次数不会超过一次(除非 Shiny 的服务器重新启动或变得空闲)。
基本上与选项 3 相同,但每 50 毫秒检查一次文件是否有更改。这是此方法的完整工作示例。请注意,除非检测到“上次修改”的更改,否则不会加载数据,因此产生的开销并不算太糟糕。
library(shiny)
globalVars <- reactiveValues()
rdata_path = "working_dataset.RData"
server <- function(input, output, session){
observe({
text = input$text_in
save(text = text, file = rdata_path, compress = TRUE)
})
observe({
invalidateLater(50, session)
req(file.exists(rdata_path))
modified <- file.info(rdata_path)$mtime
imported <- isolate(globalVars$last_imported)
if(!identical(imported, modified)){
tmpenv <- new.env()
load(rdata_path, envir = tmpenv)
globalVars$workspace <- tmpenv
globalVars$last_imported <- modified
}
})
output$text_out <- renderText({
globalVars$workspace$text
})
}
ui <- fluidPage(
textInput("text_in", "enter some text to save in Rdata", "default text"),
textOutput("text_out")
)
shinyApp(ui, server)
如果您觉得使用globalVars$workspace$text
不方便,可以使用with
直接访问globalVars$workspace
的内容.
output$text_out <- renderText({
with(globalVars$workspace, {
paste(text, "suffix")
})
})
关于r - Shiny 应用程序不反射(reflect)更新 RData 文件中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719268/
我正在通过 Rscript.exe 在托管到我的本地网络的服务器上运行 Shiny 应用程序。如果我们要将其移植到网上,我们可以通过我们设置的服务器基础设施来实现。 Shiny Server 是否添加
当我运行我的 Shiny 应用程序时,我的数据表的标题向左移动。见下文。 假设这张表在选项卡 A 上。 当我单击不同的选项卡(选项卡 B)时,标题会正确对齐,然后再次单击选项卡 A。有关更正的标题,请
是否有查询正在运行的 RStudio Shiny 网页以显示正在运行的服务器版本的变量或方法?例如。显示类似 shiny-0.10.1在网页上。 有任何想法吗? 最佳答案 您可以使用 packageV
我想在以下位置重现示例:https://scip.shinyapps.io/scip_app/ 基本上,我有一个 300 x 300 调整后的相关矩阵和一个 300 x 300 未调整的相关矩阵,我想
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 去年关闭。 社区去年审查了是否重
在我部署应用程序时,应用程序中仍然存在一些异常情况,因此我想将它们从我的帐户中删除。我试过了,但没有找到任何选择。任何帮助将不胜感激。谢谢 最佳答案 在从 shiny.io 填充 token 信息后,
据我了解,Shiny Server 的开源版本不支持身份验证。 我们有一个环境使用 WebSEAL 代理服务来验证用户并将他们的访问引导到 Web 应用程序。 我们希望向经过身份验证的用户公开 Shi
我想将一个 R 应用程序(在装有 OS RHEL6.8 的实际 Shiny 服务器上运行良好)转移到另一个"new" Shiny 服务器。我的应用程序在第一台服务器上运行良好。这个想法是将它放在性能更
我正在通过 #RMarkdown 创建一个测试页面并尝试在其中添加 #Shiny 内容。在编织到 HTML 时,我收到以下错误。 Error in appshot.shiny.appobj(list(
有没有一种简单的方法可以在 shiny 中创建这样的东西? 最佳答案 RStudio 目前正在处理 sortable 包:RStudio/sortable 请注意,它目前正在开发中(标记为实验性),因
当我在一个非常简单的 Shiny 应用程序中按下操作按钮时,我试图调用另一个 Shiny 的应用程序。另一个应用程序位于一个带有 ui.R 和 server.R 文件的名为 Benefits 的文件夹
我最近试图在我的服务器上打开一个 Shiny 的服务器应用程序,并遇到了我以前从未见过的错误。 Error in loadNamespace(j -c "R -e \"install.pack
我有 Shiny 的应用程序,它显示旧数据(延迟 4 天!),但服务器数据已刷新(当天)。 奇怪的是,服务器上不存在旧数据集 - 似乎只存在于 Shiny 缓存中。 在服务器上,我有 1 个数据集由
我有一个在本地 R 服务器(端口 8787)上运行的应用程序。当我将它移动到 Shiny Server(端口 3838)时,我收到消息 ERROR: An error has occurred. Ch
我试图消除此表格与浏览器窗口左侧之间的空间,但当我这样做时,它弄乱了导航栏链接和标题的间距。 如何在不改变 navbar/ui/li 元素的填充/边距的情况下删除 excelR 表上的填充/边距? l
我已经阅读并实现了来自 link 的 Shiny 表中的复选框.但是当我在 R 中运行时,列中的输出是 , 等在每个“选择”单元格中,我希望“选择”列中的输出是复选框,我的问题的解决方案是什么?谢谢
我一直在开发一个 Shiny 的应用程序,它开始变得相当大。 我通过将应用程序的不同部分放入各自文件中的模块中解决了这个问题,然后获取文件。 问题是,当我在源文件的服务器部分(下例中的 events.
我对 Shiny 和 DataTables 还很陌生,所以这可能是个愚蠢的问题。由于某种原因,我无法更改列宽。我试过了 output$table<-DT::renderDataTable( {w
我安装了我的 Shiny 服务器,它在这个目录下的多个应用程序上工作正常: /srv/ Shiny 服务器/app1/srv/ Shiny 服务器/app2 我可以使用 www.mydomain.co
我想在我的 Shiny 应用程序中包含我的 myMardown.md 文档。 为了显示目录,我使用了 toc 选项,还使用了 css (myStyle.css) myMarkdown.md : ---
我是一名优秀的程序员,十分优秀!