Можно ли передать символьный вектор переменной длины в функцию R? - PullRequest
0 голосов
/ 01 апреля 2020

В приведенной ниже функции:

subset_data <- function(coldata, a, b){
    coldata <- coldata[, c(a, b)]
    return(coldata)
} 

c(a, b) имеет только два элемента, a и b. Можно ли сделать его гибким, чтобы пользователь мог передавать любое количество элементов, например, иметь c(a, b, c, d) или любые другие возможности?

Пример coldata

sample tissue species time condition
s1 liver mouse morning treated
s2 liver mouse morning treated
s3 brain fly evening untreated

Использование функции

subset_data(coldata, d = c("tissue", "species")

Желаемое изменение:

subset_data(coldata, d = c("tissue", "species", "time")

или

subset_data(coldata, d = c("tissue", "species", "time", "condition")

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Есть много способов сделать это. Я думаю, что самые простые решения включают просто использование строковых векторов. Вы также можете использовать ..., но в вашем примере это непростое осложнение. Я предлагаю вам data.table или dplyr синтаксис:

data.table

library(data.table)
subset_data <- function(data, cols = c('a','b')){
  data2 <- data.table::as.data.table(data)
  return(data2[,.SD,.SDcols = cols])
}

dplyr

library(dplyr)
subset_data <- function(data, cols = c('a','b')){
  data %>% dplyr::select(cols)
}
0 голосов
/ 01 апреля 2020

Поскольку кажется, что вы просто хотите иметь возможность выбрать указанные c столбцы, почему бы не использовать select из dplyr? Например,

df = data.frame(tissue = sample(c("brain", "liver", "kidney"), 10, replace = TRUE),
                species = sample(c("mouse", "cat", "dog"), 10, replace = TRUE),
                time = sample(c("day", "evening", "night"), 10, replace = TRUE),
                condition = sample(c("dead", "alive"), 10, replace = TRUE))

Затем просто выберите нужные столбцы, например,

library(dplyr)
df %>%
  select(tissue, species)

или

df %>%
  select(tissue, species, time)

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