从后台进程更新活动会话中的全局变量Rstudio服务器

问题描述:

这可能比理论更重要;一个解决方案将是非凡的,但任何反馈/想法都是受欢迎的。从后台进程更新活动会话中的全局变量Rstudio服务器

简而言之,我想知道是否有可能在完全在会话之外的后台进程中更新rstudio-server上活动会话中的环境变量。

例如,让我们说:

  1. 我们有正在运行的每分钟为cron工作,这民调一系列网站和解析某些元素融入到一个脚本data.frame
  2. 我们的功能首先在读最初创建的data.frame,并且如果它检测到我们正在轮询的网站发生更改,它会在新行中添加一个时间戳,然后将data.frame保存回rds文件;如果它没有发现任何差异,它只是退出。
  3. 在我们的.First函数中,每个会话都以assign('.url_df', readRDS('/home/user/url_checkr.rds'), envir = .GlobalEnv)开头,以便我们始终将最新更新分配到活动工作会话中,并且它始终具有全局相同的变量名称。

目标是现在能够从我们的外部脚本中更新该环境变量,在cron或其他选项上运行,并根据需要更新任何行。

我知道如何使用echo msg > /proc/$pid/fd/0在终端之间发送消息,并且知道我们可以在我们的INITIAL函数中使用system('ps', intern=TRUE)来检查任何活动会话并获得它们的pid。问题是我们/是否有可能使用这个方法在活动会话的后台使用任何更新的字段实际更新.Global变量?从那里不难制定方式发送消息到控制台等

纯粹好奇/不确定是否包装我的头正确的整个想法?

谢谢!

我认为最直接的方法是使用R的addTaskCallback function

该函数有效地允许您在每次*R任务完成时(即,在控制台中执行的每个R表达式之后)运行代码。你可以建立一个任务回调,它有效地做你在.First中做的事情(如果需要的话更新全局变量)。随着回调就绪,随着用户继续执行R代码,全局变量将在后台自动更新。

根据您的数据大小,您可能需要添加一些安全措施,以免每次都从磁盘读取整个RDS文件;例如,您可以随文件一起写入校验和,并检查校验和是否不同。

+0

伟大的想法。感谢您的反馈。出于好奇,你有没有尝试过类似的做法? –