Основная проблема с вашим кодом заключается в том, что вы передаете все значения функциям как векторы, но затем выполняете сравнения отдельных элементов. Вам нужно либо передать элементы один за другим в функцию, либо поместить какое-либо векторизованное сравнение или цикл for в вашу функцию. Ниже описан подход for loop , который, вероятно, является наименее элегантным способом сделать это, но, по крайней мере, легко понять, что происходит.
Другая проблема заключается в том, что NA, по-видимому, необходимо обработать в векторе data , прежде чем переходить к любому из ваших условных операторов, иначе вы получите ошибку.
Последний вопрос - что делать, когда data = 50. Сейчас у вас есть условные тесты для значений больше или меньше 50, но, как вы можете видеть, 4-й пункт в data 50, так что сейчас вы получаете АН.
myfun = function(temp,data) {
result <- rep(NA,length(temp))
for (t in 1:length(temp)) {
if(temp[t] > 34) {
warning('Temperature higher than expected')
if (!is.na(data[t])) {
if (data [t] > 50) {
result[t] <- temp[t]*data[t]
} else if(data[t] < 50) {
result[t] <- temp[t]/data[t]
}
}
} else {
if (!is.na(data[t])) {
if (data[t] > 50) {
result[t] <- temp[t]*data[t]
} else if(data[t] < 50) {
result[t] <- temp[t]/data[t]
}
}
}
}
return(result)
}
Выход:
> myfun(temp = c(25,45,23,19,10), data = c(30,40,NA,50,10))
[1] 0.8333333 1.1250000 NA NA 1.0000000