2017-01-29 3 views
1

Я импортировал пакет под названием «stabledist». Она включает в себя функцию "rstable"R match.fun не видит функцию из импортированного пакета

Когда я это сделать

my_fun <- function(function_from_library) 
{ 
    function_from_library <- match.fun(function_from_library) 
    print(some_data <- function_from_library) 
} 

my_fun (5, rstable(5, alpha = 1.7, beta = 0, gamma = 1.0, delta = 1.0)) 

я получаю ошибку:»Ошибка в match.fun (some_distr):«rstable (5, альфа = 1,7, бета = 0, гамма = 1, delta = 1) 'не является функцией, символом или символом "

Все работает нормально, whnn match.fun удаляется. Есть ли все-таки, чтобы импортировать библиотеку, чтобы она могла быть видна другим? Или я могу просто пропустить match.fun?

+0

Я думаю, что 'match.fun' хочет иметь фактическую функцию, а не звонок к одному. Ваш пример прост, конечно, но неясно, что вы на самом деле собираетесь здесь делать. В качестве примера вы определяете 'my_fun' одним аргументом, но называете его двумя. – r2evans

+0

Идея состоит в использовании дистрибутива из пакета для моделирования Монте-Карло. Поэтому основная функция должна восприниматься как аргумент и распределение. Поскольку я хочу изменить дистрибутивы, я хочу передать в my_fun некоторую функцию function_from_library, потому что каждый из них принимает разные аргументы. Я не могу указать – Demaunt

+0

Используйте 'rstable' (без круглых скобок, без аргументов). Затем дайте аргументы 'function_from_library'. –

ответ

0

Это, как я реализовал свое предложение:

library(stabledist) 
my_fun <- function(function_from_library, ...) 
{ 
    function_from_library <- match.fun(function_from_library) 
    print(some_data <- function_from_library(...)) 
} 

my_fun (rstable, 5, alpha = 1.7, beta = 0, gamma = 1.0, delta = 1.0) 
#[1] 1.4600308688 -0.0004999279 1.9301805374 -1.3276383194 0.9137183709 

Это требует также знать, как использовать многоточие-механизм для передачи списков произвольной длины функций, что дополнительно отметил Роланд. Механизм печати фактически не создает вектор данных значений. Для этого вам необходимо назначить ("<-") результат «вне» тела функции (и поэтому вызов print() также не нужен).

library(stabledist) 
my_fun <- function(function_from_library, ...) 
{ 
    function_from_library <- match.fun(function_from_library) 
    function_from_library(...)  } 

some_data <- my_fun (rstable, 5, alpha = 1.7, beta = 0, gamma = 1.0, delta = 1.0) 
some_data 
# 5 random values are printed at console.