[R語言]在Function中回傳多個物件或數值

[R語言]在Function中回傳多個物件或數值

目錄

    原始文章

    [R語言]在Function中回傳多個物件或數值


    原始文章

    [R語言]在Function中回傳多個物件或數值


    在R語言中,基本上每個Function只能回傳一個物件,如果希望回傳多個物件,就必須讓回傳物件的資料型態(Data Type)為清單(List)或向量(Vector)。

    來吧,複製貼上

    回傳向量(Vector)

    test_function <- function(){
      return_list <- c()
      return_list[1] <- 1
      return_list[2] <- 2
      return_list[5] <- 10  
      return(return_list)
    }
    
    test <- test_function()
    test
    >
    [1]  1  2 NA NA 10

    回傳清單(List)

    return_list <- function(){
      test <- list()
      test[1] <- "a"
      test[2] <- "b"
      return(test)
    }
    
    test <- return_list()
    test
    >
    [[1]]
    [1] "a"
    
    [[2]]
    [1] "b"

    實際應用

    我在〈檢視變數及資料型態所佔記憶體容量,零成本提高計算效率〉中提過,日期格式的物件,像是as.Date(“2020-04-02”),所占的記憶體容量是256 byte,但轉成integer格式,也就是20200402後,容量會降到48 byte。這個認知在處理大量資料時非常重要,而以下的程式碼就是我用來處理這個問題的function。

    cal_date <- function(date, amount = 0, type = "m"){
      
      library(lubridate)
    
      # 轉換為日期格式
      date = ymd(date)
      
      # 日期計算 ...................
      if(type == "y" | type == "years" | type == "year"){
        new_date <- date %m+% years(amount)
      }else if(type == "m" | type == "months" | type == "month"){
        new_date <- date %m+% months(amount)
      }else if(type == "w" | type == "weeks" | type == "week"){
        new_date <- date %m+% weeks(amount)
      }else if(type == "d" | type == "days" | type == "day"){
        new_date <- date %m+% days(amount)
      }
      
      # 資料合併 ...................
      new_date_num <- str_replace_all(new_date, "-", "")
      
      # 如果使用vector合併時,2019-06-02會被轉成數字18049,因此用list合併。
      return_list <- list(new_date_num, new_date)
      
      return(return_list)
    }
    # 範例
    ex1 <- cal_date(20190101, -1, "m")
    ex2<- cal_date(20190101)

    推薦文章

    在DataCamp學Python和R語言,快速入門資料科學



    推薦文章

    A
    Aron

    工業設計系畢業,曾任職知名品牌行銷企劃,做點設計,寫文案也寫網站;目前擔任零售業數據分析師。最近開始練格鬥和Python量化投資。

    Content Protection by DMCA.com
    附程式碼

    1 則留言

    1. zpwglouxnt

      Muchas gracias. ?Como puedo iniciar sesion?

    發佈留言

    • * 表示必填欄位
    • 您填寫的電子郵件不會被公開
    • 請確認您的電子郵件正確無誤,當您的留言收到新的回覆時,我們會寄送通知信件給您

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *