这是一个非常简单且笼统的问题,但我尚未看到它已经讨论过。我希望我没有错过任何东西。
我开始设计具有多个功能层的大型程序,尽管在其他编程语言中有明确的策略,但我无法在R中找到关于如何处理也会具有“自变量”的函数“参数”的规范解决方案。 ”。我在“参数”和“参数”之间做了概念上的区别,即使它们实际上与输入函数相同。前者将设置在较高级别,并且不会经常更改,而后者是函数将处理的实际数据。
让我们考虑这个简单的例子:
感兴趣的子函数SF()通过“WORKER”使用不同的参数多次查询,但是使用相同的参数(在“above”上方)进行查询。当然,同一问题适用于具有多个层次的更复杂的情况。
我看到两种处理方式:
1.传递一切,但:
一种。您将在函数调用中得到无数个参数,或者将所有这些参数都包含在内。
b。因为R复制了调用函数的参数,所以它可能不是很有效。
2.每次更改参数时动态评估功能,然后将其“硬连线”到功能定义中。但是我不确定如何做到这一点,尤其是以干净的方式。
这些似乎都不是很讨人喜欢,所以我想知道你们是否对此事有意见?也许我们可以使用R的某些环境特征? :-)
谢谢!
编辑:因为在某些情况下,代码比图表好,所以这里是一个虚拟示例,其中我使用了方法“1.”,将所有参数都传递了过来。如果我有许多层和子函数,则将所有参数传递给中间层(此处为WORKER())似乎并不好。 (从代码和性能的角度来看)
F <- function(){
param <- getParam()
result <- WORKER(param)
return(result)
}
getParam <- function(){
return('O')
}
WORKER <- function(param) {
X <- LETTERS[1:20]
interm.result <- sapply(X,SF,param) # The use of sapply here negates maybe the performance issue?
return(which(interm.result=='SO'))
}
SF <- function(x,param) {
paste0(x,param)
}
编辑2 :上面示例的简单性误导了某些关注我问题的人们,因此,这里是使用离散梯度下降的更具体的示例。同样,我保持简单,因此所有内容都可以用相同的大函数编写,但这并不是我要解决的真正问题。
gradientDescent <- function(initialPoint= 0.5, type = 'sin', iter_max = 100){
point <- initialPoint
iter <- 1
E <- 3
deltaError <- 1
eprev <- 0
while (abs(deltaError) > 10^(-2) | iter < iter_max) {
v_points <- point + -100:100 / 1000
E <- sapply(v_points, computeError, type)
point <- v_points[which.min(E)]
ef <- min(E)
deltaError <- ef - eprev
eprev <- ef
iter <- iter+1
}
print(point)
return(point)
}
computeError <- function(point, type) {
if (type == 'sin') {
e <- sin(point)
} else if (type == 'cos') {
e <- cos(point)
}
}
我发现每次评估子函数时都无法传递子函数的“type”参数。 @hadley带给Closures的引用和@Greg的解释似乎是我需要的解决方案的良好途径。
最佳答案
我认为您可能正在寻找词汇范围。 R使用词法作用域,这意味着,如果您在F内部定义函数WORKER和SF,则它们将能够访问param
的当前值而无需传递给它。
如果您无法利用词法作用域(必须在F之外定义SF),那么另一种选择是创建一个新环境来存储您的参数,然后,如果所有需要的函数都可以访问该环境(通过显式传递,或通过继承(使该环境成为函数的封闭环境)),则F可以将param
分配给该环境,其他函数可以访问该值。
关于r - 如何在R中管理参数和参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18542182/