Укажите аргументы функции из строки - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь установить детали, какую функцию запускать и какие аргументы включать в начале моего скрипта, чтобы потом вызывать функцию. У меня проблемы с указанием аргументов для ввода в функцию. У меня есть фиксированный объект

v <- c(1,2,3,5,6,7,8,9,NA)

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

Пример 1:

chosenFunction <- mean
chosenArguments <- "trim = 0.1, na.rm = T"

Пример 2:

chosenFunction <- median
chosenArguments <- "na.rm = F"

Затем я хочу иметь возможность запустить указанную функцию

chosenFunction(v, chosenArguments)

К сожалению, я не могу просто вставить строку chosenArguments и ожидать, что функция запустить. Есть ли альтернативный способ указать аргументы моей функции?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Обновленный ответ на основе разъяснений ОП

chosenFunction <- mean
get_summary <- function(x, fun, ...) fun(x, ...)> 
v <- 1:100 
get_summary(v, chosenFunction, na.rm = TRUE)
# [1] 50.5

Позже, если вы хотите изменить функцию

chosenFunction <- median
get_summary(v, chosenFunction, na.rm = TRUE)
# [1] 50.5

Исходный ответ

get_summary <- function(x, chosenFunction, ...) chosenFunction(x, ...)
v <- 1:100
get_summary(v, mean, na.rm = TRUE, trim = 1)
# [1] 50.5
get_summary(v, median, na.rm = TRUE)
# [1] 50.5

Делая ..., вам не нужно указывать все аргументы

get_summary(mean, na.rm = TRUE)
# [1] 50.5
1 голос
/ 08 апреля 2020

Если мы хотим вычислить mean, мы делаем это с помощью

mean(v, na.rm = TRUE, time = 0.1)
#[1] 5.125

Другой способ заключается в использовании do.call

do.call(mean, list(v, na.rm = TRUE, trim = 0.1))
#[1] 5.125

Мы можем использовать этот факт и создать именованный список для chosenArguments и использовать его в do.call

chosenFunction <- mean
chosenArguments <- list(na.rm = TRUE, trim = 0.1)
do.call(chosenFunction, c(list(v), chosenArguments))
#[1] 5.125
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...