Подтвердить что ты не робот

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

Скажем, у меня есть куча функций, каждая из которых имеет что-то вроде MyFunction.1 и т.д. Я хочу передать эти функции в другую функцию, которая выводит небольшой отчет. В идеале я хотел бы иметь возможность обозначать разделы отчета, с помощью которого функция используется для генерации результатов.

Итак, есть ли хорошие способы получить имя предопределенной функции в виде строки?

4b9b3361

Ответ 1

Я хотел получить то же самое, и вспомнил, что library(foo) не нужны кавычки, вот что он делает:

package <- as.character(substitute(package))

Ответ 2

Другой подход состоял бы в том, чтобы передать имена функций в вашу функцию отчета, а затем получить сами функции с помощью команды 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(function.names[2], get(function.names[2]))

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

Ответ 3

Это может привести к parse(eval(...)), в котором вы открыты для этой критики:

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

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

R>

Итак, ваши функции должны называться MyFunction.1 и т.д. pp?

Ответ 4

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

> x <- function(y) print(match.call()[2])
> x(lm)
lm()

Ответ 5

Когда функция передается как объект, она теряет свое имя. См., Например, результаты следующих строк:

str(lm)
lm

Вы можете получить аргументы и тело функции, но не имя.

Мое предложение состояло в том, чтобы построить именованный список функций, где имя может быть напечатано:

> 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"

Ответ 6

Просто хочу привести пример, чтобы показать преимущество и ограничение в этой проблеме:

Я хочу "сохранить" функцию с ее именем в качестве опции, которая будет использоваться в другой функции:

R> foreach(..., .combine=test_fun) {...}

test_fun - это имя функции, и, конечно,

R> mode(test_fun)  
[1] "function"

Когда я использую его в foreach, мне просто нужно имя функции, а test_fun может быть существующей функцией (например, cbind). Итак, test_fun назначается

R> test_fun <- get('cbind')

или

R> test_fun <- assign('cbind', get('cbind'))

Итак, вы получили функцию здесь

R> test_fun  
function (..., deparse.level = 1)   
.Internal(cbind(deparse.level, ...))  

на самом деле, исходное имя не может быть сохранено, поэтому у вас нет способа конвертировать test_fun обратно в строку "cbind".

R> deparse(substitute(test_fun))  
[1] "test_fun"

Я, к сожалению, должен отменить код foreach, поэтому хочу, чтобы исходное имя отображалось в строке. Это означает, что единственный способ - сохранить 'cbind' как строку, и создание такого объекта функции не принесет никакой пользы в этом случае.

Ответ 7

что об этом:

deparse(quote(foo.bar))