Получение имени функции как строка

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

, Расположение с отступом наоборот никогда не повреждает и увеличивает достижение удобочитаемости. Это - одна причина, почему столько людей как Python с он - значительный пробел.

47
задан Terru_theTerror 30 August 2018 в 15:23
поделиться

5 ответов

Вы можете получить неоцененные аргументы функции через match.call . Например:

> x <- function(y) print(match.call()[2])
> x(lm)
lm()
6
ответ дан 26 November 2019 в 19:42
поделиться

Другой подход - передать имена функций в функцию отчета, а затем получить сами функции с помощью команды get () . Например:

function.names <- c("which","all")
fun1 <- get(function.names[1])
fun2 <- get(function.names[2])

Тогда у вас есть имена в исходном векторе символов, а у функций есть новые имена, как вы их определили. В этом случае функция all теперь вызывается как fun2 :

> fun2(c(TRUE, FALSE))
[1] FALSE

Или, если вы действительно хотите сохранить исходные имена функций, просто назначьте их локально с помощью функции assign :

assign(function.names[2], get(function.names[2]))

Если вы запустите эту команду прямо сейчас, вы получите функцию all в вашем ". GlobalEnv" . Вы можете увидеть это с помощью ls () .

15
ответ дан 26 November 2019 в 19:42
поделиться

That may lead to parse(eval(...)) at which point you are open for this critique:

R> library(fortunes)
R> fortune("parse")

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

R>

So do your functions have to be called MyFunction.1 etc pp?

7
ответ дан 26 November 2019 в 19:42
поделиться

When a function is passed around as an object, it loses its name. See, for example, the results of the following lines:

str(lm)
lm

You can get the arguments and the body of the function, but not the name.

My suggestion would be to construct a named list of functions, where the name could be printed:

> somefns <- list(lm=lm, aggregate=aggregate)
> str(somefns)
List of 2
 $ lm       :function (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...)  
 $ aggregate:function (x, ...) 

> somefns[[1]](dist ~ speed, data=cars)

Call:
somefns[[1]](formula = dist ~ speed, data = cars)

Coefficients:
(Intercept)        speed  
     -17.58         3.93  

> names(somefns)[[1]]
[1] "lm"
3
ответ дан 26 November 2019 в 19:42
поделиться

как насчет этого:

deparse(quote(foo.bar))
1
ответ дан 26 November 2019 в 19:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: