Управление операторами if, когда длина входного значения неизвестна в функциях R - PullRequest
0 голосов
/ 13 мая 2019

У меня есть две функции R. first one выводит data.frame.Первый столбец этого вывода используется внутри функции second .

В частности, функция second принимает аргумент long, который может быть любым числовым вектором, например 2, 2, 3 любой длины.Затем функция выводит соответствующий элемент из первого столбца первой функции, выведенной data.frame.

Например, если long = c(1, 3, 2), то вторая функция назначает первый элемент вывода первой функции 1, если 2 второй элемент первой функции в 2 и т. д.

Q: Аргумент long может иметь любую длину, как я могу управлятьтребуется ifelse заявления?( см. Вторую функцию ниже )?

## First function: #==================================

reg <- function(steps, r){

  x <- diag(steps+1)
  data.frame(r^abs(row(x)-col(x)))
}

## Second function: #==================================

foo <- function(long = c(1, 3, 2), r = .5){

g <- reg(max(long, na.rm = T), r)[,1][-1]  ## from the first function

r <- ifelse(long == 1, g[1], ifelse(long == 2) g[2] # . . . ## if. . . how many ifelse needed?
return(r)
}  

1 Ответ

0 голосов
/ 14 мая 2019

Вам не нужен длинный ifelse() вызов функции, вы хотите использовать индексирование. В вашем примере это может быть так просто, как

r <- g[long]

Более сложная ситуация может возникнуть, если вам нужно перевести long значения в индексы, например, что-то вроде

r <- ifelse(long == 1, g[12], ifelse(long == 2, g[3],  ...

Теперь вам нужно сначала перевести long значений (1 становится 12, 2 становится 3 и т. Д.). Как это сделать, во многом зависит от того, есть ли шаблоны для перевода или нет. Предполагая, что нет шаблонов, вы просто хотите установить именованный вектор:

translations <- c("1" = 12, "2" = 3, ...)

и используйте

r <- g[translations[as.character(long)]]

Вам нужно as.character() здесь, потому что имена элементов векторов всегда являются строками.

...