Создание функции в R, но получение замены имеет ошибку нулевой длины - PullRequest
0 голосов
/ 21 января 2019

Я попытался создать функцию f и создать функцию, поэтому, когда значение x вставляется, оно выплевывает функцию f из y. Но когда я пытаюсь запустить код для построения, он выдает мне ошибку, которая говоритчто мое y_value не имеет длины.

f <- function(x){
  if (x<0){
   print(y_values<-x*x*x)
  }
  if(x>0 & x<=1){
    print(y_values<-x*x)
  }
  if(x>1){
    print(y_values<-sqrt(x))
  }

}


x_values <- seq(-2, 2, by = 0.1)
y_values <- rep(NA, length(x_values))
for (i in seq_along(x_values)) {
  x <- x_values[i]
  y_values[i] <- f(x)
}

# output
plot(x_values, y_values, type = "l")

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я бы порекомендовал вам изучить другие методы кодирования, например, вот так:

вот один из вариантов, который не использует цикл for.Если вы просто работаете над использованием циклов for, то исправление, созданное Mauritus Evers, должно работать на вас.

library(tidyverse)

data.frame(x_values = seq(-2, 2, by = 0.1)) %>% 
  mutate(y_values = case_when(x_values < 0 ~ x_values^3,
                              x_values>=0 & x_values<=1 ~ x_values^2,
                              x_values>1 ~ sqrt(x_values))) %>% 
  ggplot(aes(x_values, y_values)) + geom_point()

обратите внимание, что я изменил ваш код для вывода, когда x_value = 0.

0 голосов
/ 21 января 2019

Два выпуска:

  1. От ?print

    ‘print’ печатает аргумент и возвращает его невидимо (через «Невидимым (х)»)

    Таким образом, ваша функция f выполняет только печать значений на консоли (вместо их возврата).

  2. Согласно вашему определению f, функция не знает, как обращаться с x=0; поэтому это создаст проблему при сохранении вывода f(0) позже.

Мы можем исправить эти проблемы, слегка изменив f на

    f <- function(x) {
      y_values <- NA
      if (x<0){
       y_values<-x*x*x
      }
      if(x>0 & x<=1){
        y_values<-x*x
      }
      if(x>1){
        y_values<-sqrt(x)
      }
      return(y_values)
  }

Тогда

x_values <- seq(-2, 2, by = 0.1)
y_values <- rep(NA, length(x_values))
for (i in seq_along(x_values)) {
  x <- x_values[i]
  y_values[i] <- f(x)
}

plot(x_values, y_values, type = "l")

enter image description here


Вы также можете использовать Vectorize для получения векторизованной функции f2, которая позволяет вам передавать x_values как вектор, избегая тем самым явного цикла for:

f2 <- Vectorize(f)
x_values <- seq(-2, 2, by = 0.1)
y_values <- f2(x_values)

Полученный сюжет такой же

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