Построение в 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: In (x/-33)^(1 / b): более длинная длина объекта не кратна
более короткая длина объекта 2: в w * (1 — (x/-33)^(1/b)): более длинный объект
длина не кратна более короткой длине объекта

Моя идея заключалась в том, что R хочет объединить все значения из каждого вектора друг с другом, что приводит к сообщению об ошибке. Есть ли способ обойти ошибку?

2 ответа

  1. Проблема здесь в том, что plotнужна функция, которая возвращает одно значение, а не вектор.

    Одним из обходных путей было бы циклическое использование bwзначений и по одному и переопределение 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)
    
  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)
    }