Определить кусочно-линейную функцию в R, вызвать функцию из списка функций

Я долго искал решение, но до сих пор не получил его работу. Я очень благодарен за каждое полезное предложение!

Я пытаюсь определить кусочно-линейную функцию в 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).

Я узнал, что это может быть проблема локальных и глобальных переменных, но я не знаю, как это исправить :(

Большое спасибо, что читаете и пытаетесь мне помочь!

P.S.: Извините за ошибки. Я не носитель языка, но старался изо всех сил ;)


person Sunny    schedule 20.08.2014    source источник
comment
По сути, вы храните функции внутри списка с именем vals, и ваша проблема в том, что вызывается неправильная функция, потому что [searchInt(x)] не возвращает правильный индекс для vals. Поместите browser() в строке перед fx <- function(x){vals[[searchInt(x)]](x)}, затем введите searchInt(x), когда вы находитесь в браузере, чтобы увидеть, получаете ли вы правильный индекс.   -  person Vlo    schedule 20.08.2014
comment
Спасибо за ваш ответ. Я сделал то, что вы предложили (по крайней мере, я на это надеюсь...) и написал browser(fx ‹- function(x){vals[[searchInt(x)]](x)}), а затем searchInt(0.8), но это привели к правильному ответу (5). searchInt(x) получает правильный индекс из vals, но кажется, что если я вызову vals из fx, R переопределит каждую функцию в vals последней добавленной.   -  person Sunny    schedule 20.08.2014
comment
Итак, я думаю, проблема в том, что R вычисляет fi с разными значениями i. Но когда я позже вызываю одну из этих функций, R видит только ее зависимость от i и затем вставляет последнее известное значение i. Так, например, если я вычисляю fi для i = 1,...,5, каждое fi сохраняется как f5 и, следовательно, также вызывается как f5. Но я хочу, чтобы R выполнял вычисления при каждом запуске цикла for с текущим значением для i, а затем сохранял эту функцию в vals[[i]] и вызывал ее именно так, как она есть, без повторной ссылки на i ... Надеюсь, вы понимаете, что я имею в виду... это возможно?   -  person Sunny    schedule 20.08.2014
comment
Почему бы вам не сделать vals <-list() вместо vals <- c(), а затем сделать vals[[i]] <- fi вместо vals <- c(vals,fi). Я не совсем понимаю ваш вопрос. Если вышеуказанное не работает, попробуйте fx <- function(x){vals[[searchInt(x)-1]](x)}, так как вы упомянули, что ваш индекс отключен на 1.   -  person Vlo    schedule 20.08.2014
comment
Это не имеет значения. Проблема не в serchInt. Я пытаюсь показать на более коротком примере: vals <- list() for(i in 1:5){fi <- function(x){x*i} vals[[i]] <- fi} Затем я вызываю vals и получаю: [[1]] function (x) {x * i} [[2]] function (x) {x * i} и т. д., где мне нужно [[1]] function(x) {x*1}, [[2]] function(x) { x * 2} и т. д. Таким образом, R не понимает, что я должен определить правило функции, но не должен вычисляться снова, когда я вызываю функцию.   -  person Sunny    schedule 20.08.2014
comment
Наконец-то я нашел еще один вопрос с той же проблемой, я думаю: [stackoverflow.com/questions/12481404/. К сожалению, я не понимаю, как это использовать в моем случае, потому что моя функция в vals все равно должна принимать аргумент x.   -  person Sunny    schedule 20.08.2014