0

我一直在寻找一个解决方案,但仍然没有得到它的工作。我非常感谢每一个有用的建议!

我试图在 R 中定义一个分段线性函数,这意味着,我想定义一个在不同间隔上具有不同线性表达式的函数。这些间隔取决于 xWerte 和 yWerte 中给出的数据点(以及这些数据点的数量),因此切割点的数量和不同的函数规则并没有固定(这就是为什么我用 for 循环而不是用ifelse 构造...)

到目前为止,我一直在尝试定义切割(间隔的切割点)和这些间隔中的每一个的值 = 函数规则。我写下代码以使您了解我所做的事情,尽管在我看来这部分正在工作并且我的问题与我的代码的这一部分无关......

# cuts contains the points where the function rule changes, this works fine    
cuts <- c(xWerte[2])
for(i in 3:length(xWerte)-1){
cuts <- c(cuts,xWerte[i+1])
}
cuts

# vals is supposed to contain the function rules in each interval
vals <- c()
for(i in 1:(length(xWerte)-1)){
# fi -> function rule in the i.th interval, also works fine...
fi <- function(x){
return(as.numeric(m[[i]])*x 
+(as.numeric(yWerte[i])
-as.numeric(m[[i]])*as.numeric(xWerte[i])))
}
# here, I want to add the i different function rules to the values
vals <- c(vals,fi)
}

# searchInt looks up the interval x is in, works fine
searchInt <- function(x){findInterval(x, c(0, cuts),rightmost.closed = TRUE)}

这一切似乎都在做我想做的事。 现在,这是我的问题:

# fx should insert x to the function in vals 
# that belongs to the interval x is located in... 
fx <- function(x){vals[[searchInt(x)]](x)}
# one example with x= 0.8
print(fx(0.8))

这告诉我

[1] 0.619

这是 vals[length(vals)]=vals[6]。但由于 searchInt(0.8) = 5,它应该显示 vals[5]=0.63806。

我知道我成功地向 vals 添加了不同的函数规则,因为如果我这样做了

for(i in 1:length(vals)){
print(vals[[i]](0.8))}

R告诉我

[1] 0.15216
[1] 0.5143
[1] 0.5143
[1] 0.59998
[1] 0.63806 # this is vals[[5]](0.8), the result fx(0.8) should evaluate to...
[1] 0.619

所以,不同区间的正确函数规则是存在的,但它们不能被 fx 正确调用。在我看来,R 似乎“忘记”了 vals 中曾经有不同的函数规则。它只是调用添加到 vals 的最后一个函数规则,不管 searchInt(x) 的值是多少。

我发现这可能是局部和全局变量的问题,但我不知道如何解决它:(

非常感谢您阅读并尝试帮助我!

PS:如有错误请见谅。我不是母语人士,但我已经尽力了;)

4

0 回答 0