簡體   English   中英

帶有 lapply 的嵌套 R 函數

[英]Nested R Function with lapply

我正在嘗試進入函數式編程,我可以使用一個簡單的一維列表來工作,但是如果我嘗試用對象打包列表,它就會開始中斷。 程序的一部分是使用 dput 寫入文件,我無法讓 dput 在第一個函數調用中工作,所以我創建了另一個函數來處理 dput 調用 (put_symbols_into_file)。

我的 batch_get_symbols 函數中的 dput 有問題,所以我想我只是嵌套它,它本身就可以工作,但我想創建多個市場(債券、股票、共同基金)作為參數列表並運行 lapply他們。

我想如果我可以在 batch_get_symbols 中容納 dput 的 fil 參數(例如使用 %>%),我會很高興,但我真的很想知道如何將其作為未來嵌套的嵌套函數來執行。 如果有一種方法可以用類構造函數來做到這一點(我還沒有做過類),那就沒問題了。 我發現 R 中的閱讀課程有點令人困惑。

我知道問題在於范圍(即無法識別數據元素)。 第一個函數調用第二個函數,第二個函數由於某種原因不知道參數項是什么。

library(HelpersMG)
library(BatchGetSymbols)
library(future)
library(data.table)
library(quantmod)

BetaTestCoefficient = .25
wget("ftp://ftp.nasdaqtrader.com/SymbolDirectory/nasdaqtraded.txt")
wget("ftp://ftp.nasdaqtrader.com/SymbolDirectory/mfundslist.txt")
#9 quarters is 5479/8897 61% (60%)
nasdaqTraded <- as.character(head(read.csv("nasdaqtraded.txt",sep="|")$Symbol,-2))
mfunds <- as.character(head(read.csv("nasdaqtraded.txt",sep="|")$Symbol,-2))

put_symbols_into_file <- function(fil,data,size) {
  dput(batch_get_symbols(data,size),fil)
}

batch_get_symbols <- function(data,size) {
  BatchGetSymbols(tickers = sample(data,size*betaTestCoefficient),
                  do.parallel = TRUE,
                  first.date = first.date,
                  last.date = last.date, 
                  be.quiet = TRUE,
                  #cache results in "can only subtract from "Date" objects"
                  #probably due to parallel
                  do.cache=FALSE)
}

fil_Nasdaq <- c()
fil_Nasdaq <- tempfile()
#mfunds
fil_mfunds <- c()
fil_mfunds <- tempfile()

first.date <- Sys.Date() - 821
last.date <- Sys.Date() - 814

list_nasdaq <- list(fil_Nasdaq,nasdaqTraded,770)
list_mfunds <- list(fil_mfunds,mfunds,324)
mylists <- list(list_nasdaq, list_mfunds)

lapply(mylists, sapply, put_symbols_into_file)
#Or...
lapply(mylists,put_symbols_into_file)

錯誤

lapply(mylists,put_symbols_into_file)
 Error in batch_get_symbols(data, size) : 
  argument "data" is missing, with no default 

然而,這有效,向我展示了嵌套有點工作,但它不適用於 lapply

put_symbols_into_file(fil_Nasdaq,nasdaqTraded,770)

注意:當我創建列表時,我必須做 as.character() else,值(符號名稱)被轉換為整數

您可以嘗試以下操作:

lapply(mylists, FUN=function(x) put_symbols_into_file(fil=x[[1]], data=x[[2]], size=x[[3]]))

或者,您可能更喜歡首先命名列表元素以方便完成任務。

list_nasdaq <- list(fil=fil_Nasdaq, data=nasdaqTraded, size=770)
list_mfunds <- list(fil=fil_mfunds, data=mfunds, size=324)

mylists <- list(list_nasdaq, list_mfunds)
str(mylists)

List of 2
 $ :List of 3
  ..$ fil : chr "C:\\Temp\\RtmpO4ojSu\\file12a8471239eb"
  ..$ data: chr [1:8897] "A" "AA" "AAAU" "AACG" ...
  ..$ size: num 770
 $ :List of 3
  ..$ fil : chr "C:\\Temp\\RtmpO4ojSu\\file12a8215c3d94"
  ..$ data: chr [1:8897] "A" "AA" "AAAU" "AACG" ...
  ..$ size: num 324

lapply(mylists, FUN=function(x) put_symbols_into_file(fil=x$fil, data=x$data, size=x$size))

我想知道是否有另一個使用mapply的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM