Объединить аргументы функции в новую функцию в R - PullRequest
0 голосов
/ 14 мая 2019

Я хотел бы объединить различные аргументы функции (например, read.table) в одну функцию.

Обычно у меня был бы следующий код для загрузки кадра данных:

df <- read.table(path_to_file, header=TRUE, colClasses = c("numeric", "numeric"), na.strings = "None")

Если я хочу загрузить несколько разных фреймов данных, я набираю все аргументы:

df2 <- read.table(path_to_file, header=TRUE, colClasses = c("numeric", "numeric"), na.strings = "None")
df3 <- read.table(path_to_file, header=TRUE, colClasses = c("numeric", "numeric"), na.strings = "None")

Однако я хотел бы объединить аргументы header, colClasses и na.strings в функции, чтобы мне не приходилось повторно вводить все аргументы. Я попробовал следующий код, но он не работает:

x <- function(){
header=TRUE
colClasses = c("numeric", "numeric")
na.strings = "None"
}

df <- read.table(path_to_file, x())

Как правильно это сделать?

Ответы [ 2 ]

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

Вы можете просто обернуть его вокруг новой функции, как эта

read.table2 = function(path_to_file){
  read.table(path_to_file, header=TRUE, 
             colClasses = c("numeric", "numeric"), 
             na.strings = "None")
}

df = read.table2(path_to_file)
2 голосов
/ 14 мая 2019

Вот несколько альтернатив:

1) purrr :: частичный Функция partial в purrr может использоваться для создания новой функции с уже заданными аргументами.

library(purrr)

my.read.table <- partial(read.table, 
  header = TRUE, colClasses = c("numeric", "numeric"), na.strings = "None")

my.read.table("myfile.dat")

Функция Curry в функциональном пакете и функция set.defaults в пакете diversitree аналогичны. Также см. setDefaults в комплекте Quantmod для соответствующего подхода.

2) обертка Эта обертка изменяет значения по умолчанию для указанных аргументов, сохраняя возможность их дальнейшей переопределения.

my.read.table.2 <- function(..., 
  header = TRUE, colClasses = c("numeric", "numeric"), na.strings = "None") {

  read.table(..., header = header, colClasses = colClasses, na.strings = na.strings)
}

my.read.table.2("myfile.dat")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...