Построение графика в R: функция с двумя векторами

#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)
}