R:程序启动后的准确时间执行命令

时间:2018-04-03 13:16:57

标签: r time

我可能会稍微滥用R,但我希望在脚本启动后执行R命令和特定时间。应该执行命令的时间保存在数据框中。

e.g。

Time <- c(0.5, 5, 13, 30)
Text <- c("Half a second", "5 seconds", "13 seconds", "Half a minute")

df <- data.frame(Time = Time, Text = Text) 
df
#  Time          Text
#1  0.5 Half a second
#2  5.0     5 seconds
#3 13.0     13 seconds
#4 30.0 Half a minute

目标是执行命令,例如。自程序启动以来经过x毫秒(存储在print())之后的df$Time_ms

我的第一种方法是在命令之间使用Sys.sleep()。这几乎是可以接受的,但由于每个命令也需要一些时间(print()不是真的,而是其他更多),它不会超级准确。

我最好的解决方案是使用&#39; while&#39;循环:

# Programm start
start_time <- Sys.time() # Save Program start time. 

for(i in 1:nrow(df)){
  while(Sys.time() < df$Time[i] + start_time){} # Wait until the System Time is larger than start time plus the time when the command shall be executed.  

  print(paste(df$Text[i], "has passed.")) # Execute the command. 
}

它正在发挥作用。但我对编程没有经验,但我想这不是一个非常优雅的解决方案。你怎么看?有人有更好的&#34;溶液

1 个答案:

答案 0 :(得分:0)

我最终使用了来自nicola的提议,并进行了一些小改动。如果程序已运行超过一分钟并且您减去'start_time'当前时间'Sys.time()',结果将以分钟为单位而不是秒。为了防止这种情况,我使用'difftime'。

# Create example data.frame
Time <- c(0.5, 5, 13, 30)
Text <- c("Half a second", "5 seconds", "13 seconds", "Half a minute")

df <- data.frame(Time = Time, Text = Text) 

# Programm start
start_time <- Sys.time() # Save Program start time. 

for(i in 1:nrow(df)){
  wait <- df$Time[i]-(as.numeric(difftime(Sys.time(),start_time, units = "secs"))) # Calculate the waiting time in second.

                    Sys.sleep(wait)
                    print(paste(df$Text[i], "has passed.")) # Execute the command. 
}