lapply 的嵌套 R 函数

Nested R Function with lapply

我正在尝试进入函数式编程,我可以开始使用简单的一维列表,但如果我尝试用对象打包列表,它就会开始崩溃。程序的一部分正在使用 dput 写入文件,我无法让 dput 在第一个函数调用中工作,所以我创建了另一个函数来处理 dput 调用 (put_symbols_into_file).

我的 batch_get_symbols 函数中的 dput 有问题,所以我想我只是简单地嵌套它,它自己工作,但我想创建多个市场(债券、股票、相互funds) 作为参数列表和 运行 lapply 在它们上面。

我想如果我可以在 batch_get_symbols 中容纳 dput 的 fil 参数(例如使用 %>%)我会很高兴,但我真的很想知道如何做到这一点用于未来嵌套的嵌套函数。如果有一种方法可以使用 class 构造函数(我还没有完成 classes),那就没问题了。我发现在 R 中阅读 classes 有点混乱。

我知道问题出在范围上(即无法识别数据元素)。第一个函数调用第二个函数,第二个函数出于某种原因不知道参数项是什么。

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() 否则,当我创建列表时,值(符号名称)被转换为整数

您可以尝试以下方法:

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