Я очень смущен тем, что происходит в этом примере.Функция, присвоенная списку внутри цикла for в R
Я пытаюсь написать function factory и передать ему список параметров для создания списка функций. Мне повезло с этим методом для простых функций. Теперь я пытаюсь выполнить более сложную задачу, которая использует список параметров. Мне не удалось заставить его работать с lapply, но я открыт для этого подхода. Я попробовал петлю, и все ведет себя странно.
library(TTR)
data(ttrc)
#last 100 closing prices for testing
ttrc <- tail(ttrc['Close'], 100)
#Function Factory for creating moving average functions
MAFactory <- function(fun, n) function(x){
setNames(get(fun)(x = x, n = n), paste(fun, n, sep = "_"))
}
#parameters to use with the funciton factory
grid <- expand.grid(fncts = c("SMA", "EMA", "DEMA"),
ns = c(10, 20, 30),
stringsAsFactors = FALSE)
MAfuns <- vector("list", nrow(grid))
#loop over the grid to apply the function factory
for (i in 1:nrow(grid)) {
#print statements for debugging
print(i)
MAfuns[[i]] <- MAFactory(grid[i, 1], grid[i, 2])
print(paste(grid[i,], collapse = ''))
}
#test cases
sma10 <- MAFactory("SMA", 10)
sma10Simple <- SMA(x = ttrc, n = 10)
(sma10Simple == sma10(ttrc))
(MAfuns[[1]](ttrc) == sma10(ttrc))
(MAfuns[[1]](ttrc) == sma10Simple)
#cause of failure
tmpE <- environment(MAfuns[[1]])
mget(envir = tmpE, x = ls(envir = tmpE))
#all MAfuns use last parameters from grid???
#but it works outside the loop when i = 1?!
MAfuns[[1]] <- MAFactory(grid[1, 1], grid[1, 2])
(MAfuns[[1]](ttrc) == sma10(ttrc))
Я думаю, что проблема имеет что-то делать с оценкой обещания, основываясь на этом question. Но исправление, вызывающее аргумент на фабрике функций, не работает для меня. Если по какой-то причине это невозможно сделать внутри цикла, как я могу переписать его с помощью лапши?
Я считаю, что этот ответ должен быть вам полезен: http://stackoverflow.com/a/30131673/2372064 – MrFlick
Ваш пример не воспроизводится. Откуда «Cl»? Вероятно, вам придется использовать «force» для обеспечения оценки одного из ваших аргументов в окружающих средах функциях. У меня есть некоторые примечания по этой проблеме вы можете найти здесь: https://wahani.github.io/2014/09/Promises-and-Closures-in-R/ – Sebastian
Извините. Cl - из пакета quantmod. Я отредактировал сценарий так, чтобы он вам не нужен. – brandco