Написание функции с if () в R - PullRequest
0 голосов
/ 05 мая 2020

Я хочу создать функцию, которая принимает два входа (фрейм данных и строку). Более того, если строка равна "cols", эта функция должна возвращать количество столбцов, в противном случае она должна возвращать количество строк.

Мой код:

wl_df <- function(df,string) {
  if(string == "cols")
    return(ncol(df))
} else {
  return(nrow(df))

}

Однако я получаю следующие ошибки:

Error: unexpected 'else' in:
"        return(ncol(df))
    } else"

,

Error: no function to return from, jumping to top level

и

Error: unexpected '}' in "    }"

Почему я получаю эти ошибки и как я могу исправить их?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 05 мая 2020

Вам не хватает открывающей { в строке if и закрывающей скобки в else или самой функции. Хотя у вас и есть совпадающее количество от { до }, они не связаны правильно.

Попробуйте:

wl_df <- function(df,string) {
  if (string == "cols") {
    return(ncol(df))
  } else {
    return(nrow(df))
  }
}

Или, как @AllanCameron правильно предложено:

wl_df <- function(df,string) {
  if (string == "cols") return(ncol(df)) else return(nrow(df))
}
1 голос
/ 05 мая 2020

Вот другой подход, та же функция, но более компактный:

wl_df <- function(df, string) ifelse(string == "cols", ncol(df), nrow(df))
0 голосов
/ 05 мая 2020

Вы можете векторизовать его, если хотите поразить весь список фреймов данных.

@library(tidyverse)
dfTests <- list(mtcars, iris, diamonds)

wl_df <- function(dfs,string) {
  map_dbl(dfs,
    ~ case_when(
        string == "cols" ~ ncol(.x),
        string == "rows" ~ nrow(.x),
        TRUE             ~ NA))
}

# R > wl_df(dfTests, "cols")
# [1] 11  5 10
# R > wl_df(dfTests, "rows")
# [1]    32   150 53940
...