1. 程式人生 > 其它 >r語言 迴圈次數超過了50這個最大值_錯過了520還可以一起過兒童節,如何用R語言‘擼’一個文字跑馬燈去表白...

r語言 迴圈次數超過了50這個最大值_錯過了520還可以一起過兒童節,如何用R語言‘擼’一個文字跑馬燈去表白...

技術標籤:r語言 迴圈次數超過了50這個最大值

引言

和大家分享一下如何用R語言來寫一個文字跑馬燈吧。這個文字跑馬燈寫起來基本不費時間,在辦公室摸一下魚大概就夠了。

正文

這個文字跑馬燈我準備按照面向物件程式設計來寫。因為,面向物件就會有物件。而且,這個東西寫出來就是拿給你們去表白的。

首先我們定義一個基類,這個基類要具有像PPT一樣的逐頁播放文字的功能。

#' @title projector
projector <- R6::R6Class(
  classname = "projector",
  public = list(
    initialize = function(sildes) { # 建構函式
      private$slides <- sprintf("r%s",sildes) # 給每頁文字的開始加上'r'字元以覆蓋上一頁
      private$length <- base::length(private$slides) # 記錄所有的播放頁數量
      private$position <- 0 # 初始播放位置為第一頁之前
      private$slide <- private$slides[private$position]
    },
    nextslide = function(){ # 播放下一頁
        private$position <- private$position + 1 # 獲取下一頁位置
        if ( private$position > private$length ){ # 播放到最後一頁後回到第一頁
            private$position <- private$position - private$length
        }
        private$slide <- private$slides[ private$position ] # 設定當前播放頁為下一頁
        base::cat(private$slide) # 播放當前播發頁
    },
    autoplay = function(fps = 10){ # 自動播放,播放速率每秒10頁
        while(T){ # 無限迴圈,可以用for改寫控制迴圈次數
            self$nextslide() # 播放下一頁
            base::Sys.sleep(1/fps) # 休眠控制播放速率
        }
    }
  ),
  private = list(
    slide = NA,# 當前播放頁
    slides = c(), # 所有的播放頁
    length = 0,# 播放頁的總數
    position = 0# 當前播放位置
  )
)
#' @test 
player <-  projector$new(c("我是第一頁","我是第二頁","我是第三頁"))
player$nextslide() # 播放下一頁
player$nextslide()
player$nextslide()
player$nextslide()
player$autoplay(3) # 以每秒三張的速率播放,可以使用 Ctrl+C 組合鍵 跳出

d9447cfedf727e2819e4ac28eac83846.gif

利用這個文字PPT播放器,我們只要設定好播放頁就可以實現文字跑馬燈了。比如:

player2 <-  projector$new(
  c(
    "我是第一頁        ",
    "是第一頁        我",
    "第一頁        我是",
    "一頁        我是第",
    "頁        我是第一",
    "        我是第一頁",
    "      我是第一頁  ",
    "    我是第一頁    ",
    "  我是第一頁      ", 
    "我是第一頁        " # 最後一頁的下一頁是第一頁,讓播放頁閉環以到達流暢的視覺效果
  )
)
player2$autoplay(3)

99a887e2136316e98881c05c13a34f1b.gif

當然我們不需要那麼傻的的每次都手動設定播放頁。接下來,我們從PPT文字播放器這個基類派生一個類,這個派生類新增了根據跑馬燈文字自動設定播放頁的功能。

#' @title scroller
scroller <- R6::R6Class("scroller", 
  inherit = projector,
  public = list(
    initialize = function(film, width = 50 ) { # 過載基類的建構函式,根據輸入的文字和寬度自動設定播放頁
        film <- paste0( base::strrep(" ",width), film,base::strrep(" ",width), collapse="" ) 
        slides <- rep( base::strrep(" ",width) , nchar(film)-width+1 )
        for( i in 1:length(slides) ){
            slides[i] <- substr(film,i,i+width-1)
        }
        super$initialize(slides)
    }
  )
)
#' @test 
boy <- scroller$new("你可真是個小可愛! 不如...   和我在一起吧^_^",50) # 設定播放頁的寬度為50
boy$autoplay(10) # 以每秒10頁的速率播放
girl <- scroller$new("哈哈哈*—*  我就知道你喜歡我! 好吧,我就勉強答應你咯~",50) # 設定播放頁的寬度為50
girl$autoplay(10) # 以每秒10頁的速率播放

5393d83c2febd0d9b8bab2721aea615e.gif

6d64dd49403a804cdd1cd01bc1e80907.gif

結束語

好了,摸魚結束,我要去搬磚了。愛TA,就為TA建造一個家!祝你們表白成功!