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
。
我正在尝试进入函数式编程,我可以开始使用简单的一维列表,但如果我尝试用对象打包列表,它就会开始崩溃。程序的一部分正在使用 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
。