Как ввести вектор в качестве переменной в функцию?

#r

#r

Вопрос:

В одном из моих домашних заданий меня попросили напечатать цены облигаций за 2015,2016,2017,2018 годы. Поскольку в 2015,2016 годах было 252 торговых дня, в 2017 году — 251, а в 2018 году — 250, мне нужно написать оператор if. Вот моя попытка:

 plt <- function(a) {
  if (a == 2015) {
    x <- 1:252
  }
  else if (a == 2016) {
    x <- 1:252
  }
  else if (a == 2017) {
    x <- 1:251
  } else {
    x <- 1:250
  }
  plot(x=x, y=data[data$Year == a, 5], type="l", col="red")
}
  

Однако, когда я ввожу

 function(c(2015, 2016, 2017, 2018))
  

отображается только черновик 2015 года, и R возвращает

 Warning messages:
1: In if (a == 2015) { :
  the condition has length > 1 and only the first element will be used
2: In data$Year == a :
  longer object length is not a multiple of shorter object length  
  

Если я введу эти годы отдельно, это даст четыре идеальных графика.

Комментарии:

1. У вас есть дата, связанная с каждой ценой? Если да, я думаю, что их печать была бы лучше. Если нет, то, что вы, вероятно, хотите визуализировать, это распределение цен (по годам), и в этом случае диаграмма рассеяния менее подходит для этой задачи, чем другие варианты, такие как прямоугольная диаграмма, гистограмма или частотный полигон.

2. Ваш if оператор работает нормально, но он выполняется только для первого элемента. Поместите это в for цикл, for (i in 1:length(a)) { ...your code with a[i] instead of a...} .

3. Не могли бы вы предоставить некоторую информацию о вызываемом объекте data , пожалуйста?

4. Это немного сбивает с толку, но здорово, что вы предоставили некоторый код. Сначала мне интересно, function(c(2015,2016,2017,2018) вы имеете в виду plt(2015,2016,2017,2018) , если вместо. Вместо if вы, вероятно, хотите ifelse , который будет использовать векторизованный подход.

5. Спасибо вам, ребята. Проблема не устранена.

Ответ №1:

Давайте предположим, что вместо function(c(2015,2016,2017,2018) вы имеете в виду plt(c(2015,2016,2017,2018) . Если я ошибаюсь в этом, я удалю ответ.

Давайте запустим функцию. В этом случае a == c(2015, 2016, 2017, 2018) .

В вашей функции, которую вы спрашиваете, делает a == 2015 . Нет, это не так; a это вектор длиной 4, как показано выше. 2015 в r — это скаляр или вектор длиной 1.

Делает a == 2016 ? Нет, и аналогично для 2017 и 2018 годов. Итак, ни одно из ваших условий if никогда не выполняется, и, следовательно, ваше plot() не может работать, потому что x никогда не создается.

Вместо этого вы можете захотеть переписать свой код, чтобы брать a и работать с каждым элементом. Также вы можете захотеть упростить, создав a_length <- c(252, 252, 251, 205) , а не записывая все.

На этом этапе вы можете использовать цикл for или lapply() для получения графиков.