Convertendo o argumento da função R em uma string

Aug 24 2020

Eu tenho uma função que parece

my_function <- function(object)
{
  # code goes here
}

Gostaria que a função (entre outras coisas) exibisse o nome do argumento (conforme passado para a função). Portanto, se minha chamada de função for:

xxx <- my_function(my_object)

então gostaria de saber como obter a função para imprimir a string "my_object".

Alguém pode ajudar por favor?

Respostas

2 Duck Aug 24 2020 at 00:25

Eu sugeriria a próxima abordagem mais próxima do que você deseja. Com certeza você pode modificá-lo para obter outras saídas:

#Function
my_function <- function(x)
{
  as.character(eval(parse(text=enquo(x)))[2])
}
#Apply
my_function(x = my_object)

Resultado:

[1] "my_object"

Uma melhoria graças a @MrFlick é a próxima:

#Function
my_function <- function(x)
{
  rlang::as_label(rlang::enquo(x))
}
#Apply
my_function(x = my_object)

O que produz a mesma saída com um estilo mais elegante na função:

[1] "my_object"
4 Gwang-JinKim Aug 24 2020 at 02:19

Uma Rsolução mais -ish seria usar substitute(obter substituto para obj) em combinação com deparse(lançar símbolo para string):

my_function <- function(obj) {deparse(substitute(obj))}

RRegra geral de metaprogramação: prefira substitute!

my_function(my_object)
## [1] "my_object"
1 G.Grothendieck Aug 24 2020 at 00:56

Para exibir a chamada inteira, use match.callassim:

f <- function(x) { print(match.call()); x }
f(pi)
## f(x = pi)
## [1] 3.141593

SE desejar exibir a chamada apenas para depuração, sem modificar a própria função, use trace:

g <- function(x) x  # test function

trace(g)
g(pi)
## trace: g(pi)
## [1] 3.141593