#r #vector
#r #вектор
Вопрос:
Я хочу построить самостоятельно определенную функцию в R, используя два вектора и неизвестную переменную. Я думал о чем-то подобном:
# Define parameters
b<-c(1.70,4.70,7.60)
w<-c(0.38,0.44,0.50)
# Define function
k<-function(x){0.07*(w*(1-(x/-33)^(1/b)))^4}
# Plot
plot(k)
Цель состоит в том, чтобы построить график функции, получив три строки. Одна строка должна содержать первую пару b-вектора / w-вектора, вторая строка должна содержать вторую пару, а третья строка должна содержать последнюю пару векторов. Когда я компилирую код, я получаю сообщение об ошибке:
1: В (x / -33) ^ (1 / b): большая длина объекта не кратна меньшей длине объекта 2: В w * (1 — (x / -33) ^ (1 / b)) : большая длина объекта не кратна меньшей длине объекта
Моя идея заключалась в том, что R хочет объединить все значения из каждого вектора друг с другом, что приводит к сообщению об ошибке. Есть ли способ обойти ошибку?
Комментарии:
1. Не имеет прямого отношения к предупреждающему сообщению, но
(x/-33)^(1/b)
даст вамNaN
для x> 0 и ваших значенийb
. Посколькуplot.function
по умолчанию значения для x отображаются в [0, 1], вы ничего не увидите на своем графике.
Ответ №1:
Проблема здесь в том, что plot
нужна функция, которая возвращает одно значение, а не вектор.
Одним из обходных путей было бы перебирать ваши b
w
значения и одно за другим и переопределять вашу k
функцию по ходу работы. Я также изменил вашу k
функцию, поскольку она не была определена для параметров по умолчанию.
k <- function(b, w) {
function(x){b*x w}
}
plot2 <- function(k, b, w) {
plot(k(b[1], w[1]))
for (i in 2:length(b)) {
foo <- k(b[i], w[i])
curve(foo, add = TRUE)
}
}
plot2(k, b, w)
Комментарии:
1. Очевидно, что это можно значительно улучшить: следует добавить множество проверок (длина (b)> 1, длина (b) = длина (w) …), Кроме того, может быть интересно передать дополнительные параметры (b, w) с помощью конструкции с тремя точками, чтобы убедиться, что это сработаетс большей гибкостью…
Ответ №2:
Если я вас правильно понял, это должно дать вам желаемый результат.
b<-c(1.70,4.70,7.60)
w<-c(0.38,0.44,0.50)
curve((0.07*w[1])*((1-(x/(-33))^1/b[1])^4), from=0, to=20, type = 'l')
for(i in 2:length(b))
{
curve((0.07*w[i])*((1-(x/(-33))^1/b[i])^4), from=0, to=20, add = TRUE)
}