求助:如何让R以指定的时间频率运行代码?

COS论坛 | 统计之都 COS论坛 | 统计之都 软件应用 S-Plus & R语言 求助:如何让R以指定的时间频率运行代码?

该主题包含 11 条回复,6个帖子,最后由  ®γσ, Lian Hu Eng4 月, 3 周 之前 更新。

查看 12 个帖子 - 1 到 12(总计 12 个)
  • 作者
    帖子
  • 1 楼

    chfang129
    Participant

    最近在写交易模块,用的万得的API,希望做到的是能每隔5秒更新一次数据并计算建平仓条件
    数据更新和计算条件的模块已经写好,但如何做到让R能每隔5秒就运行一次这些模块呢?
    搜索许久也未果,特来求大神指导…

    2 楼

    superdesolator
    Participant

    回复 第1楼 的 chfang129:我觉得另外用R写个程序利用pipeopen之类的函数每隔5秒调用一次R运行那些模块,含泪跪求交易数据更新和计算条件的模块,我也想用R写交易,毕竟WIND,最近提供R接口了!但是我是新手,没经验,想看看实际的模块到底是什么样的,希望咱可以多交流,[email protected]
    好人一生平安[s:11]

    3 楼

    chfang129
    Participant

    回复 第2楼 的 superdesolator: 更新和计算的模块 都是用简单的R写的 最多就是用了点万得提供的w.wsq;w.wsd之类的函数,真心没技术含量… 我去研究下你说的 pipeopen..

    4 楼

    renkun-ken
    Participant

    tcltk2扩展包可以做timer tick.
    下面提供一个简单的样例代码。

    假设每次要进行的任务是 task 函数,每次运行都打印出当前的系统时间。

    task <- function() {
      print(Sys.time())
    }
    

    接下来载入 tcltk2 扩展包。

    library(tcltk2)
    t1 <- tclTaskSchedule(wait = 1000,expr = task(),redo = TRUE)
    

    接下来每秒都会自动执行一次 task() 表达式。t1 里面包含了这个任务的信息,可以用来调整或者停止任务。每次启动一个新任务,都会分配一个task id,这是一个任务的标识。

    停止这个任务,则可以运行

    tclTaskDelete(id = t1$id)
    

    5 楼

    superdesolator
    Participant

    回复 第5楼 的 renkun-ken:我总感觉task如果要完成LZ所说的任务,5秒之内完成不了话会如何?因为LZ的数据是每隔5秒提取的,并且数据更新和计算在一个模块即都放在task中,相当于task要在5秒内完成,否则来不及提取下一批数据?有没有这个问题,怎么解决?

    6 楼

    lyxmoo
    Moderator

    回复 第5楼 的 renkun-ken: 这个好,找了n久的方法。

    7 楼

    renkun-ken
    Participant

    回复 第5楼 的 superdesolator:可以通过判断这个任务的运行状态来解决,或者通过设定全局变量表征系统状态。

    8 楼

    enthumelon
    Participant

    在R本身考虑这个问题有个很烦的事情:

    task <- function() {
     	Sys.sleep(2)
    	print(Sys.time())
    }
    library(tcltk2)
    t1 <- tclTaskSchedule(wait = 1000,expr = task(),redo = TRUE)
    [1] "2014-07-17 12:54:52 EDT"
    [1] "2014-07-17 12:54:55 EDT"
    [1] "2014-07-17 12:54:58 EDT"
    tclTaskDelete(id = t1$id)
    

    就是间隔了2(程序执行所要时间)+1s(希望的时间)。 这个是个极端的例子,但是很不幸在重复次数很多的情况下很致命。 具体而言,你不能在R进程忙碌时调用它计算任何东西…所以一般用的都是计划任务。
    Linux下cran/at都很容易实现。问题在于Windows,使用计划任务实在麻烦。 这件事情如果在windows上,是简单更改上述task为(更加极端的10s+1s的例子):

    task <- function() {
      system('Rscript -e "Sys.sleep(10);print(Sys.time())"',wait = F)
    }
    f.loops<-function(f,sleep=1,iter=5){# f(...),...
      for(i in 1:iter)  {Sys.sleep(sleep);f()}
    }
    f.loops(task,1)
    > [1] "2014-07-17 14:03:45 EDT"                                                                                                          │
    [1] "2014-07-17 14:03:46 EDT"                                                                                                            │
    [1] "2014-07-17 14:03:47 EDT"                                                                                                            │
    [1] "2014-07-17 14:03:48 EDT"                                                                                                            │
    [1] "2014-07-17 14:03:49 EDT"
    

    当然你会惊喜的发现Widnows下Rscript的有时启动长达秒的量级…多么痛彻的领悟啊。不过还好,在很多人的电脑上不是这样的. 这里的代码Sys.sleep(10);print(Sys.time())必须能独立本段程序运行。不然逻辑上都有问题,因为你搞不清楚那个进程会先结束,如果公用名字空间…天知道会发生什么。

    9 楼

    chfang129
    Participant

    信息量好大…慢慢学习去…感谢各位大神….

    10 楼

    superdesolator
    Participant

    回复 第8楼 的 enthumelon:我没理解你说的内容,在f.loops的循环里面,进入f()之后,按道理是应该等它返回再继续循环,所以我把wait=T之后几乎是这样,只是有的间隔不是11,有的是12…
    而你这里的wait=F我不理解什么意思,只是针对Sys.sleep()之类的函数吗?否则wait什么…
    感觉wait=F之后,是不是就f.loops和task就是独立的进程了,如果这样f.loops第一次循环调用task,task就独立运行了,而它运行期间f.loops早就运行完了,所以不会等到第2次调用这个task…是这样吗?
    我凌乱了[s:18]

    11 楼

    superdesolator
    Participant

    我大概理解了,应该是wait=F之后,每次循环到调用f()的时候都会另开独立进程计算f(),这里Rscript的启动确实有的时候会要1秒。。。

    12 楼

    ®γσ, Lian Hu Eng
    Participant
    > i1 <- length(list.files(pattern = '.rds'))
    > while (i1 < 6195) {
    + i1 <- length(list.files(pattern = '.rds'))
    + aaa <- list.files(pattern = '.rds') %>% 
    + ldply(., function(x) read_rds(path = x) %>% ncol) %>% 
    + unlist %>% unique
    + print(paste0(now(), ' has ', i1, ' files with ', aaa, 
    + ' columns each.'))
    + flush.console()
    +     Sys.sleep(30)
    + }
    [1] "2017-01-01 22:00:33 has 1054 files with 6 columns each."
    [1] "2017-01-01 22:01:04 has 1057 files with 6 columns each."
    [1] "2017-01-01 22:01:35 has 1061 files with 6 columns each."
    [1] "2017-01-01 22:02:06 has 1064 files with 6 columns each."
     readRDS(path) でエラー:  コネクションからの読み取りエラーが発生しました

    while loop

    昨儿尝试编写shinyapp呈现后宫三千佳丽干货:GITHUB上的一些交易策略源码,结果发现错误,6195个鸡精得重新用两天时间处理… 今儿参阅R Sys.sleep with print not working in while loops尝试以上方式不过连接方面不稳定。尝试以下方式,结果看傻眼了! :blush: :blush: :blush:

    > task <- function() {
    +  i1 <- length(list.files(pattern = '.rds'))
    + aaa <- list.files(pattern = '.rds') %>% 
    + ldply(., function(x) read_rds(path = x) %>% ncol) %>% 
    + unlist %>% unique
    + print(paste0(now(), ' has ', i1, ' files with ', aaa, 
    + ' columns each.'))
    + flush.console()
    +     Sys.sleep(30)
    + }
    > library(tcltk2)
    > t1 <- tclTaskSchedule(wait = 30, expr = task(), redo = TRUE)
    > 
    > t1
    tclTask 'task2' scheduled after 30 ms (elapsed)
    Rescheduled forever
    runs:
    task()
    > tclTaskDelete(id = t1$id)
    > task <- function() {
    +  i1 <- length(list.files(pattern = '.rds'))
    + aaa <- list.files(pattern = '.rds') %>% 
    + ldply(., function(x) read_rds(path = x) %>% ncol) %>% 
    + unlist %>% unique
    + print(paste0(now(), ' has ', i1, ' files with ', aaa, 
    + ' columns each.'))
    + flush.console()
    +     Sys.sleep(30)
    + }
    > library(tcltk2)
    > t1 <- tclTaskSchedule(wait = 30, expr = task(), redo = TRUE)
    > tclTaskDelete(id = t1$id)
    > t1
    tclTask 'task2' scheduled after 30 ms (elapsed)
    Rescheduled forever
    runs:
    task()
    

    继续加油!!!僕得干爸爹!

    白戸則道:実に面白いですね!
    http://github.com/scibrokes/owner

查看 12 个帖子 - 1 到 12(总计 12 个)

您必须先登录才能回复该主题。