запись в выражение без использования if else

#r

#r

Вопрос:

Есть ли способ написать всеобъемлющее выражение без использования условия if-else для обоих случаев.

Спасибо

  1. n может принимать значение — 0 или 1
 
if (n == 2)
{
  output <- c(0.5, 0.5)
} else
{
  output <- c(1, 0)
}

 
  1. сгенерировать tibble с помощью x и y, основываясь на значении n — 0 или 1
 library(tidyverse)

N = 1000
if (n == 1)
{
  x <- runif(N/n, min = 0, max = 5)
  y <- runif(N/n, min = 0, max = 5)
  tbl <- tibble(x, y)
} else
{
  x1 <- runif(N/n, min = 0, max = 5)
  y1 <- runif(N/n, min = 5, max = 10)
  
  x2 <- runif(N/n, min = 5, max = 10)
  y2 <- runif(N/n, min = 0, max = 5)
  
  tbl <- tibble(x = c(x1, x2),
                y = c(y1, y2))
}

 

Ответ №1:

Это может быть более применимо с switch

 f1 <- function(n) {
        n <- deparse(substitute(n))
        switch(n, `2` = c(0.5, 0.5), c(1, 0))

   }


f1(1)
#[1] 1 0
f1(2)
#[1] 0.5 0.5
f1(5)
#[1] 1 0
 

Ответ №2:

Если вы хотите избежать использования if...else ... , возможно, приведенный ниже код будет вариантом:

  • Случай 1
 list(c(1, 0), c(0.5, 0.5))[[(n == 2)   1]]
 
  • Случай 2
 list(
  {
    x1 <- runif(N / n, min = 0, max = 5)
    y1 <- runif(N / n, min = 5, max = 10)

    x2 <- runif(N / n, min = 5, max = 10)
    y2 <- runif(N / n, min = 0, max = 5)

    tbl <- tibble(
      x = c(x1, x2),
      y = c(y1, y2)
    )
  },
  {
    x <- runif(N / n, min = 0, max = 5)
    y <- runif(N / n, min = 0, max = 5)
    tbl <- tibble(x, y)
  }
)[[(n == 1)   1]]