Вложенная R-функция с лакомством - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь войти в функциональное программирование, которое я могу заставить работать с простым одномерным списком, но если я пытаюсь упаковать список с объектами, он начинает ломаться. Часть программы использует запись в файл с помощью dput, и мне не удалось заставить dput работать внутри первого вызова функции, поэтому я создал еще одну функцию для обработки вызова dput (put_symbols_into_file).

У меня был проблема с dput в моей функции batch_get_symbols, поэтому я подумал, что просто вложу ее, которая работает сама по себе, но я бы хотел создать несколько рынков (облигации, акции, паевые инвестиционные фонды) в виде списков параметров и запускать их без проблем.

Полагаю, если бы я мог разместить параметр fil в dput в batch_get_symbols (например, с%>%), я бы подошел к go, но мне бы очень хотелось узнать, как сделать это как вложенный функция для будущего вложения. Если есть способ сделать это с помощью конструктора классов (я еще не делал классов), то это было бы хорошо. Я нахожу классы чтения в 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 (), иначе, когда я создавал свои списки, значения (имена символов) были конвертированы в целое число

1 Ответ

1 голос
/ 20 марта 2020

Вы можете попробовать следующее:

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))

I ' Интересно, есть ли другое решение, использующее mapply.

...