评估switch语句中的匿名函数

时间:2011-02-25 14:16:40

标签: r switch-statement anonymous-function

说我有这样的代码:

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内传递(在这种情况下它不是匿名的),但我想知道在{{1}中评估匿名函数是否可能和/或合理声明。

3 个答案:

答案 0 :(得分:2)

我想可以安排do.call()来调用匿名函数:

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

e.g:

> 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 :(得分:1)

根据我的记忆,在没有大括号的情况下编写您的对象(无论是data.frame,列表还是在您的情况下,还是函数)都会唤起print()

显然:

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

答案 2 :(得分:1)

正如罗马所说,你得到一个函数返回。如果你想要一个函数的结果,那么只需要放置函数(在你的情况下,放下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的相同结果。