Estou tentando R
criar uma função wrapper que chame uma função interna específica (que é uma função existente) e execute algumas ações com ela. Minha função wrapper incluirá um argumento func
para a função interna que desejo chamar, e essa função sempre terá uma estrutura padrão específica com um argumento específico de interesse, mas o argumento pode ser chamado por um nome diferente em casos diferentes. Portanto, também quero um argumento na minha função wrapper arg.name
que especifique o nome de um dos argumentos da função interna. Também quero poder especificar argumentos adicionais com reticências ...
para permitir outras entradas gerais para a função interna. Aqui está um esboço do que quero fazer (mas este código não funciona):
#Example of the internal function
#This would be an existing function - not one that I program myself
#The variable n might be named something different in some cases
EXISTING.FUNCTION <- function(a, n) { a + n^2 }
#Example of the wrapper function
#It includes arg.name to specify the name of the variable
MY.WRAPPER.FUNCTION <- function(value, func, arg.name, ...) {
#Evaluate the internal function using inputs wrapper inputs
OUTPUT <- func(arg.name = value, ...)
#Return the output
OUTPUT }
Quero poder chamar a função wrapper assim:
MY.WRAPPER.FUNCTION(value = 4, func = EXISTING.FUNCTION, arg.name = 'n', a = 3)
#What I want to get
[1] 19
#What I actually get
Error in func(arg.name = value, ...) : unused argument (arg.name = value)
Não tenho certeza de como R
reconhecer a sequência de caracteres arg.name
como o nome da variável no uso interno da função interna especificada dentro da função wrapper. Acredito que isso use uma ou mais funções de avaliação (por exemplo, substitute
, quote
, as.name
, etc.), mas ainda não consegui modificar o código acima para que ele seja arg.name
reconhecido como identificador do nome do argumento na função interna.
Informações adicionais: O texto acima foi escrito para simplificar o problema, mas, se for relevante, as funções existentes com as quais quero trabalhar são funções quantílicas para distribuições de probabilidade. Normalmente, elas terão um argumento de probabilidade chamado, p
mas quero considerar a possibilidade de alguém programar uma função quantílica com um nome diferente para o argumento de probabilidade. Não tenho certeza se esse contexto é relevante para a solução, mas essa é a motivação para o problema.
Sua pergunta contém muitas questões de design.
Não tenho muita certeza do que você quer. Solução rápida (suja)
Não vejo muito sentido nisso.
Você pode usar
substitute()
para criar uma chamada não avaliada para o fornecidoFUNC
com...
expandido. Em seguida, adicione oVALUE
como um argumento nomeado à chamada usando oARG.NAME
. Por fim, avalie a chamada construída no ambiente do chamador.Comparado à
do.call()
abordagem anterior, construir a chamada dessa forma tem a vantagem de não forçar a avaliação de...
eVALUE
antes da chamada paraFUNC
. Isso pode ou não ser importante, dependendo de como o métodoFUNC
trata seus argumentos.(Observe a leve ofuscação (capitalização) dos nomes dos argumentos do wrapper. Isso serve para alguma proteção contra correspondência parcial de argumentos nomeados nos
...
formais.)