【问题标题】:Run R Script for specified time interval以指定的时间间隔运行 R 脚本
【发布时间】:2018-01-27 16:55:40
【问题描述】:

下面是我的示例数据框mydf,我的数据框的实际长度未知,因为它将为每个10 seconds 更新一个新行。我还创建了空数据框dadbdcdd

    Vin   LA    LN
      A   98    89
      B    7    98
      C    5    89
      D   23    74
      A   81    23
      A   28    37
      B   34    48

现在我需要实现一个逻辑,我应该从数据帧mydf 检索数据并根据mydf$Vin 的值将其推送到相应的数据帧,即IF Vin == A,然后是@ 的相应行数据987654331@和LN应该被推送到数据框da,同样,IF VIN == B然后是LA&LN的数据->db。这个验证Vin 中的值并将数据推送到相应数据帧的脚本应该为每个11 Seconds 执行。

例如。如果脚本在Time = Current_Second 执行,那么脚本应该在Time = Current_Second + 11 重新运行。

【问题讨论】:

  • for 循环与 Sys.sleep ... 例如

标签: r dataframe


【解决方案1】:

也许将 da、db、dc 和 dd 放在一个列表中更容易。没必要,但你的 for 循环会变得更清晰。

# sample data
df = read.table(text="Vin   LA    LN
A   98    89
B    7    98
C    5    89
D   23    74
A   81    23
A   28    37
B   34    48",header=T)

# a list of your dataframes.
your_df = list(A= data.frame(LA= numeric(0), LN= numeric(0)),
               B= data.frame(LA= numeric(0), LN= numeric(0)),
               C= data.frame(LA= numeric(0), LN= numeric(0)),
               D= data.frame(LA= numeric(0), LN= numeric(0))
)

for(i in 1:nrow(df))
{
  your_df[[df$Vin[i]]] = rbind(your_df[[df$Vin[i]]], df[i,c("LA","LN")])  
  Sys.sleep(11) # set this to the desired amount of time between iterations.
  print(your_df) # optional to show progress.
}

输出:

$A
  LA LN
1 98 89
5 81 23
6 28 37

$B
  LA LN
2  7 98
7 34 48

$C
  LA LN
3  5 89

$D
  LA LN
4 23 74

【讨论】:

    【解决方案2】:

    您可以使用Sys.sleep 执行以下操作:

    repeat {
      # Your code goes here
      cat("Hello, again!\n")
    
      Sys.sleep(11) # Wait 11 seconds
    }
    # Hello, again!
    # Hello, again!
    # ...
    

    或者,您应该避免像上面那样执行for-loop 或repeat,并每隔X 秒从R 外部执行您的程序。参见e.g. this.

    【讨论】:

      【解决方案3】:

      我会建议以下方法:

      # Define interval in seconds
      
      interval <- 11
      strt_tme <- Sys.time()
      
      
      repeat {
          if (Sys.time() - strt_tme > interval) {
              strt_tme <- Sys.time()
              print(paste("Start time:", strt_tme,
                          "Current time:", Sys.time()))
          }
      }
      

      注意事项

      Sys.sleep相反,如果时间间隔大于所需的秒数,它会在每个场合执行所需的命令。如果您的数据每 11 秒更新一次,但读取表需要 1 分钟,您可能愿意执行下一次刷新,在上一次刷新之后立即,因此在系统时间上进行计算可能比使用 'Sys 更安全.sleep 在实践中给你:operations time + Sys.sleep(11) = your actual interval。建议的方法反映了逻辑:等待至少 11 秒(interval),如果读取的数据超过此时间,则立即重复。我认为最终选择取决于您希望如何刷新数据,但现在您有不同的解决方案可供选择。

      【讨论】:

        【解决方案4】:

        我觉得你可以用proc.time命令设置间隔,你可以定义你想要的时间

        【讨论】:

          猜你喜欢
          • 2020-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-20
          • 2015-08-08
          • 2018-07-20
          • 2013-08-04
          相关资源
          最近更新 更多