我有一个数据框“ data”,并想计算大约30个函数f(CS)。目的是为每个函数f(CS)找到CS uniroot
。我正在寻找一个循环,该循环生成函数f(CS)和函数结果(表示CS的结果)。
相关的问题:的R -命名多种功能在一个for循环,并在循环多种功能
这些函数应具有不同的名称(function_1,function_2,function_3等),并且每个函数使用数据帧“ data”中不同行的值。我尽力创建一个最小的可复制示例:
data <- data.frame(A=c(154,154,154,154,110154,102500,0,0,0,0,205200,0,0,0,0),
B=c(-0.647, -0.738, -0.749, -0.691, -0.600, 2.455, 2.358, 2.289, 2.264, 2.267, 2.455, 2.358, 2.289, 2.264, 2.267))
function_1 <- function(CS){
sum(data$A[1:5]/(1+data$B[1:5]/100+CS/10000)^(1:5) - 100000)
}
function_2 <- function(CS){
sum(data$A[6:10]/(1+data$B[6:10]/100+CS/10000)^(1:5) - 100000)
}
function_3 <- function(CS){
sum(data$A[11:15]/(1+data$B[11:15]/100+CS/10000)^(1:5) - 200000)
}
请注意,function_3(200000)中的常数不是错字。正如我提到的,即时计算的根源为uniroot
:
uniroot(function_1, c(-1000,1000))$root #267.3119
uniroot(function_2, c(-1000,1000))$root #4.500001
uniroot(function_3, c(-1000,1000))$root #14.5
我尝试使用两个for循环,如下所示:
for (i in seq(from = 1, to = nrow(data)/5)){
noquote(paste0("function_",i,"")) <- function(CS){
sum(data$A[1:5]/(1+data$B[1:5]/100+CS/10000)^(1:5))
}
}
for (i in seq(from = 1, to = nrow(data)/5)){
uniroot(noquote(paste0("function_",i,")), c(-1000,1000))$root
}
我不知道如何实现不断变化的常量和不断变化的函数名称,因为noquote(paste0())
这似乎不起作用。如果您需要任何进一步的信息,请告诉我。
您已经接近了,但这不完全noquote
是为了什么。相反,使用的组合assign
和get
,就像这样:
for (i in seq(from = 1, to = nrow(data)/5)){
assign(paste0("function_",i)), function(CS){
sum(data$A[1:5]/(1+data$B[1:5]/100+CS/10000)^(1:5))
}
}
for (i in seq(from = 1, to = nrow(data)/5)){
uniroot(get(paste0("function_",i)), c(-1000,1000))$root
}
但是,我不确定示例中的第一个循环是否会重新创建您在问题的第一个代码块中手动列出的所需函数。也不应该为data
变更建立索引吗?像这样?
for (i in seq(from = 1, to = nrow(data)/5)){
indices <- (1+(i-1)*5):(5+(i-1)*5)
assign(paste0("function_",i,"")), function(CS){
sum(data$A[indices ]/(1+data$B[indices]/100+CS/10000)^(1:5))
}
}
无论如何,我敢肯定其他人会很快说,您可能可以找到一种方法来绕过像这样的对象名称。大多数人认为最佳实践是手动分配功能,然后使其更加灵活。在您提供的示例中,可以构造函数,使其将索引作为参数,然后只有一个可以通过多种方式使用的函数:
flexibleFunction <- function(CS, indices){
sum(data$A[indices]/(1+data$B[indices]/100+CS/10000)^(1:5) - 100000)
}
uniroot(flexibleFunction , c(-1000,1000), 1:5)$root
uniroot(flexibleFunction , c(-1000,1000), 6:10)$root
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句