Ответ 1
Я хотел получить то же самое, и вспомнил, что library(foo)
не нужны кавычки, вот что он делает:
package <- as.character(substitute(package))
Скажем, у меня есть куча функций, каждая из которых имеет что-то вроде MyFunction.1
и т.д. Я хочу передать эти функции в другую функцию, которая выводит небольшой отчет. В идеале я хотел бы иметь возможность обозначать разделы отчета, с помощью которого функция используется для генерации результатов.
Итак, есть ли хорошие способы получить имя предопределенной функции в виде строки?
Я хотел получить то же самое, и вспомнил, что library(foo)
не нужны кавычки, вот что он делает:
package <- as.character(substitute(package))
Другой подход состоял бы в том, чтобы передать имена функций в вашу функцию отчета, а затем получить сами функции с помощью команды 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()
.
Это может привести к 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?
Вы можете получить неоцененные аргументы функции через match.call
. Например:
> x <- function(y) print(match.call()[2])
> x(lm)
lm()
Когда функция передается как объект, она теряет свое имя. См., Например, результаты следующих строк:
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"
Просто хочу привести пример, чтобы показать преимущество и ограничение в этой проблеме:
Я хочу "сохранить" функцию с ее именем в качестве опции, которая будет использоваться в другой функции:
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'
как строку, и создание такого объекта функции не принесет никакой пользы в этом случае.
что об этом:
deparse(quote(foo.bar))