【发布时间】:2016-06-11 22:13:03
【问题描述】:
我对这个示例中发生的事情感到非常困惑。
我正在尝试编写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。但是在函数工厂中调用参数的修复对我不起作用。如果由于某种原因这不能在循环内完成,我怎么能用 lapply 重写它?
【问题讨论】:
-
我相信这个答案应该对你有帮助:stackoverflow.com/a/30131673/2372064
-
您的示例不可重现。
Cl来自哪里?您可能必须使用force来强制在封闭环境的函数中评估您的参数之一。我有一些关于这个问题的说明,你可以在这里找到:wahani.github.io/2014/09/Promises-and-Closures-in-R -
对不起。 Cl 来自 quantmod 包。我编辑了脚本,所以你不需要它。
-
不错的博文,感谢您的链接。我在 MAFactory 中使用
force评估n,但它不起作用。在发布此内容后的第二天,我通过重新使用 out for 循环解决了我的实际问题。但是,我仍然不确定我是否理解惰性评估,因为我无法弄清楚为什么这个示例不起作用。
标签: r function loops functional-programming