首页 > 解决方案 > 在 R 的控制台输出中更有效和更快地打印值的策略

问题描述

伙计们感谢您花一些时间在帖子中。我想寻求通用策略来提高计算速度,以及加快控制台窗口中某些值的打印过程,同时循环非常简单的计算。

例如,我做了一个小彩票模拟代码。下面的代码将首先生成从 1 到 49 的 6 个中奖号码。然后它会继续抽 6 个号码,一次抽 7 次,直到它们匹配中奖号码。

它将在一行中显示 7 次抽奖和迭代(即抽奖次数),直到它们与中奖号码匹配。

Lottery = function(computetime=FALSE){

  # winning numbers
  sixnumber = sample(1:49, 6, replace=FALSE)


  getfirst1 = getfirst2 = getfirst3 = getfirst4 = getfirst5 = getfirst6 = getfirst7 = 0
  iter=0

  if(computetime==FALSE){


  # loop until we have match winning number from 7 draws  
  while(! 6 %in% c(getfirst1, getfirst2, getfirst3, getfirst4, getfirst5, getfirst6, getfirst7)){
  iter=iter+7
  draw1 = sample(1:49, 6, replace=FALSE)
  draw2 = sample(1:49, 6, replace=FALSE)
  draw3 = sample(1:49, 6, replace=FALSE)
  draw4 = sample(1:49, 6, replace=FALSE)
  draw5 = sample(1:49, 6, replace=FALSE)
  draw6 = sample(1:49, 6, replace=FALSE)
  draw7 = sample(1:49, 6, replace=FALSE)

  # added for line to be arranged consistantly by formatting the numbers in each draw
  draw1[draw1<10] = paste0(0,draw1[draw1<10])
  draw2[draw2<10] = paste0(0,draw2[draw2<10])
  draw3[draw3<10] = paste0(0,draw3[draw3<10])
  draw4[draw4<10] = paste0(0,draw4[draw4<10])
  draw5[draw5<10] = paste0(0,draw5[draw5<10])
  draw6[draw6<10] = paste0(0,draw6[draw6<10])
  draw7[draw7<10] = paste0(0,draw7[draw7<10])

  # sum of the matching numbers in each draw
  getfirst1 = sum(sixnumber %in% draw1)
  getfirst2 = sum(sixnumber %in% draw2)
  getfirst3 = sum(sixnumber %in% draw3)
  getfirst4 = sum(sixnumber %in% draw4)
  getfirst5 = sum(sixnumber %in% draw5)
  getfirst6 = sum(sixnumber %in% draw6)
  getfirst7 = sum(sixnumber %in% draw7)

  # Print out in console
  cat(draw1, " ", draw2, " ", draw3, " ", draw4, " ", draw5, " " , draw6, " " , draw7, "   ", iter, "\n")

  # without Sys.sleep, printing process will be slowed down and get lagged
  Sys.sleep(time=0.0001)
  }
  return(sixnumber)

  }else{

    # This part will test the time until 3500 draws
    a=Sys.time()
    while(iter != 3500){
      iter=iter+7
      draw1 = sample(1:49, 6, replace=FALSE)
      draw2 = sample(1:49, 6, replace=FALSE)
      draw3 = sample(1:49, 6, replace=FALSE)
      draw4 = sample(1:49, 6, replace=FALSE)
      draw5 = sample(1:49, 6, replace=FALSE)
      draw6 = sample(1:49, 6, replace=FALSE)
      draw7 = sample(1:49, 6, replace=FALSE)

      draw1[draw1<10] = paste0(0,draw1[draw1<10])
      draw2[draw2<10] = paste0(0,draw2[draw2<10])
      draw3[draw3<10] = paste0(0,draw3[draw3<10])
      draw4[draw4<10] = paste0(0,draw4[draw4<10])
      draw5[draw5<10] = paste0(0,draw5[draw5<10])
      draw6[draw6<10] = paste0(0,draw6[draw6<10])
      draw7[draw7<10] = paste0(0,draw7[draw7<10])

      getfirst1 = sum(sixnumber %in% draw1)
      getfirst2 = sum(sixnumber %in% draw2)
      getfirst3 = sum(sixnumber %in% draw3)
      getfirst4 = sum(sixnumber %in% draw4)
      getfirst5 = sum(sixnumber %in% draw5)
      getfirst6 = sum(sixnumber %in% draw6)
      getfirst7 = sum(sixnumber %in% draw7)

      cat(draw1, " ", draw2, " ", draw3, " ", draw4, " ", draw5, " " , draw6, " " , draw7, "   ", iter, "\n")
      Sys.sleep(time=0.0001)
    }
    b=Sys.time()
    cat(b-a, "Seonds for 3500 draws")
  }  

}


Lottery(computetime = TRUE)

我想获得一些关于如何加快

1) 一次对 6 个数字进行 7 次采样的计算

2) 打印出这七张画并一次迭代一行的最快和最流畅的方式。(例如,没有Sys.sleep()函数或当前设置 Sys.sleep(0.0001),控制台在运行该函数 30 秒后打印出有滞后的行。我想知道如何避免打印过程中的这种滞后。)

这篇文章的目的是提高我的效率并更多地了解 R 中的打印控制台过程。

太感谢了!

标签: r

解决方案


这将 3500 次绘制的计算时间从大约 9 秒减少到大约 1.5 秒:

Lottery = function(computetime=FALSE, seed = 1){
  set.seed(seed)
  # winning numbers
  sixnumber = sample(1:49, 6, replace=FALSE)

  getfirst <- as.list(rep(0, 7))
  iter=0

  if(computetime==FALSE){


    # loop until we have match winning number from 7 draws  
    while(!any(unlist(getfirst) == 6)){
      iter=iter+7
      draw <- lapply(1:7, function(x) sample(1:49, 6))

      # sum of the matching numbers in each draw
      getfirst <- lapply(draw, function(x) sum(sixnumber %in% x))

      # Print out in console
      draw <- lapply(draw, function(x) {x[x < 10] <- paste0(0, x[x < 10]); x})
      cat(sapply(draw, paste, collapse = " "), sep = "\n")

      # without Sys.sleep, printing process will be slowed down and get lagged
      Sys.sleep(time=0.0001)
    }
    return(sixnumber)

  }else{

    # This part will test the time until 3500 draws
    a=Sys.time()
    while(iter != 3500){
      iter=iter+7
      draw <- lapply(1:7, function(x) sample(1:49, 6))

      getfirst <- lapply(draw, function(x) sum(sixnumber %in% x))

      draw <- lapply(draw, function(x) {x[x < 10] <- paste0(0, x[x < 10]); x})
      cat(sapply(draw, paste, collapse = " "), sep = "\n")

      Sys.sleep(time=0.0001)
    }
    b=Sys.time()
    cat(b-a, "Seconds for 3500 draws")
  }  

}

我们使用列表能够有效地循环lapplysapply,因此避免了每一步都执行七次的需要。我还添加了为可重复性设置特定种子的选项。


推荐阅读