Для циклов, которые проверяют пустой диапазон - PullRequest
0 голосов
/ 17 декабря 2018

При работе с рекурсивными уравнениями в математике принято писать уравнения, которые выполняются в некотором диапазоне k = 1,...,d с неявным соглашением о том, что если d < 1, то система уравнений считается пустой.При программировании на R я хотел бы иметь возможность писать циклы for таким же образом, как математическое утверждение (например, рекурсивное уравнение), чтобы он интерпретировал диапазон с верхней границей ниже нижней границы как пустой,Это гарантировало бы, что синтаксис алгоритма имитирует синтаксис математического оператора, на котором он основан.

К сожалению, R не интерпретирует цикл for таким образом, и поэтому это обычно приводитк ошибкам, когда вы программируете свои циклы таким образом, чтобы имитировать основную математику.Например, рассмотрим простую функцию, в которой мы создаем вектор нулей длиной n, а затем меняем первые значения d на значения, используя цикл над элементами в диапазоне k = 1,...,d.Если мы введем d < 1 в эту функцию, мы бы хотели, чтобы функция распознала, что цикл должен быть пустым, чтобы мы могли получить вектор всех нулей.Однако, используя стандартный цикл for, мы получаем следующее:

#Define a function using a recursive pattern
MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in 1:d) { OBJECT[k] <- 1 }
  OBJECT }

#Generate some values of the function
MY_FUNC(10,4);
[1] 1 1 1 1 0 0 0 0 0 0

MY_FUNC(10,1);
[1] 1 0 0 0 0 0 0 0 0 0

MY_FUNC(10,0);
[1] 1 0 0 0 0 0 0 0 0 0
#Not what we wanted

MY_FUNC(10,-2);
[1] 1 1 1 1 1 1 1 1 1 1
#Not what we wanted

Мой вопрос: Есть ли в R какая-либо функция, которая выполняла бы циклы, такие как цикл for,но интерпретирует цикл как пустой, если верхняя граница ниже, чем нижняя граница?Если функции не существует, есть ли способ запрограммировать R на чтение циклов таким образом?

Обратите внимание: Я не ищу ответы, которые просто переписывают этот пример функциитаким образом, что удаляет петлю.Я знаю, что это можно сделать в данном конкретном случае, но моя цель - сделать цикл более общим.Этот пример показан только для того, чтобы дать четкое представление о явлении, с которым я имею дело.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Imho нет никакого общего цикла for, который делает то, что вам нравится, но вы можете легко сделать это, добавив

if(d > 0) break

в качестве первого оператора в начале цикла.

0 голосов
/ 17 декабря 2018

Функция может быть векторизована

MY_FUNC <- function(n,d) {
 rep(c(1, 0), c(d, n -d))
  }

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0
MY_FUNC(10, -2)

Ошибка в rep (c (1, 0), c (d, n - d)): недопустимый аргумент "times"

0 голосов
/ 17 декабря 2018

РЕДАКТИРОВАТЬ

Если вы не хотите возвращать ошибку при задании отрицательного ввода, вы можете использовать pmax с seq_len

MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in seq_len(pmax(0, d))) { OBJECT[k] <- 1 }
  OBJECT
}

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0
MY_FUNC(10, -2)
#[1] 0 0 0 0 0 0 0 0 0 0

Предыдущий ответ

Предпочитают seq_len над 1:d, и он заботится об этой ситуации

MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in seq_len(d)) { OBJECT[k] <- 1 }
  OBJECT 
}

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0

MY_FUNC(10, -2)

Ошибка в seq_len (d): аргумент должен быть принудительно приведен к неотрицательному целому числу

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