Оценка анонимных функций в выражении switch - PullRequest
3 голосов
/ 25 февраля 2011

Скажем, у меня есть такой код:

tmp <- switch("b",
              a = print("foo"),
              b = function() paste("I want to evaluate this one!"),
              stop("say what now?")
)

Теперь, если я наберу tmp, я получу неоцененную функцию, поэтому мне нужно добавить пару скобок для ее оценки:

tmp
## function() paste("I want to evaluate this one!")
tmp()
## [1] "I want to evaluate this one!"

Конечно, я могу предопределить эту функцию и передать ее в пределах switch (в этом случае это не аноним), но я хочу знать, возможно ли и / или целесообразно ли оценить анонимную функциюв пределах switch заявления.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

Полагаю, можно было бы организовать do.call() для вызова анонимной функции:

tmp <- switch("b",
              a = print("foo"),
              b = do.call(function() paste("I want to evaluate this one!"), 
                          list()),
              stop("say what now?")
)

Например:

> tmp
[1] "I want to evaluate this one!"

Редактировать Прощеверсия выше:

tmp <- switch("b",
              a = print("foo"),
              b = (function() paste("I want to evaluate this one!"))(),
              stop("say what now?")
)

Таким образом, анонимная функция создается в первом наборе скобок, и результирующая функция вызывается добавлением второго набора ().


Но мне кажется чище превратить анонимную функцию в именованную функцию и вызвать ее:

foo <- function() paste("I want to evaluate this one!")
tmp <- switch("b",
              a = print("foo"),
              b = foo(),
              stop("say what now?")
)

, которая имеет тот же конечный результат:

> tmp
[1] "I want to evaluate this one!"

Если это всевнутри функции foo() может быть определено как встроенное, поэтому оно существует только во время выполнения вызова внешней функции.

1 голос
/ 25 февраля 2011

Как сказал Роман, возвращается функция.Если вы хотите получить результат функции, просто поместите функцию (в вашем случае отбросьте function()).Если вам нужна комбинация различных функций, заключите ее в квадратные скобки:

tmp <- switch("b",
              a = print("foo"),
              b = {
                    x <- paste("I want to evaluate this one!")
                    x <- paste(x,sample(1:10,1))
                    print(x)
              },
              stop("say what now?")
)

Но вы должны знать, что вы сохраняете только результат, поэтому вы всегда получите тот же результат, что и sample.

1 голос
/ 25 февраля 2011

Насколько я помню, запись вашего объекта (будь то data.frame, список или, как в вашем случае, функция) без фигурных скобок вызывает print().

Очевидно:

> class(tmp())
[1] "character"
> class(tmp)
[1] "function"
...