Если-тогда ошибка в R, где, казалось бы, нет проблем? - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь использовать элементы из вектора для выполнения операторов if-then, но по какой-то причине я продолжаю сталкиваться со следующей ошибкой:

"Ошибка в if (xd [2] <= a) {: пропущенное значение там, где необходимо ИСТИНА / ЛОЖЬ "</p>

Я не уверен, почему это продолжается, поскольку единственное, что отличается от этой строки кода, кажется, что я Я использую xd [2] вместо xd [1]. Я получаю желаемые результаты с помощью xd [1], но не xd [2]. Условие, кажется, также выполнено.

reset1 = {

a = 0.3 #lower bound of belief 

b = 0.9 #upper bound of belief 

A = 5 

w = c(1,2)

xd = c(1,2)

w[1] = 5   #cost of abatement/effort for Driver1

xd[1] = 0.3

w[2] = 3   #cost of abatement/effort for Driver2

xd[2] = 0.3



expfine1 = function(xd,A,a,b){if(xd[1]<=a){A} else if(a<xd[1] & xd[1]<b){(((b-xd[1])/(b-a))*A)} else if(xd[1]>b){0}}
expfine1(xd[1],A,a,b)

expcost1 = function(xd){proba1(xd[1])*expfine1(xd[1],A,a,b)}
expcost1(xd[1])

expfine2 = function(xd,A,a,b){if(xd[2]<=a){A} else if(a<xd[2] & xd[2]<b){(((b-xd[2])/(b-a))*A)} else if(xd[2]>b){0}}
expfine2(xd[2], A, a, b)
expcost2 = function(xd){proba2(xd[2])*expfine2(xd[2],A,a,b)}
expcost2(xd[2])

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вы должны использовать функцию ifelse(), которая векторизована :

expfine1 <- function(xd,A,a,b) {
    ifelse(xd <= a, A,
        ifelse(a < xd & xd < b, A*(b-xd) / (b-a),
            ifelse(xd > b, 0, NA)))
}
expfine1(xd,A,a,b)
0 голосов
/ 23 февраля 2020

Из кода ОП и Принятый ответ Тима Я понимаю, что ОП хочет создать функцию, которая линейно интерполируется на интервале [a, b] и является постоянной вне интервала.

Для полноты в базе R есть функция approxfun(), которая возвращает " функцию, выполняющую линейную (или постоянную) интерполяцию ":

expfine <- approxfun(c(a, b), c(A, 0), rule = 2L)

Эта функция может быть вызванным с вектором x значений:

expfine(c(0.2, 0.3, 0.4, 0.8, 0.9, 1.0))
[1] 5.0000000 5.0000000 4.1666667 0.8333333 0.0000000 0.0000000

Обратите внимание, что есть различия в определениях функций OP, которые не определены для x == b. Я предполагаю, что это произошло случайно. Я считаю, что интервалы должны быть правильно закрыты последовательно. Также обратите внимание, что реализация Тима явно возвращает NA для x == b.

Функция может быть построена

plot(expfine)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...