6

我有一个函数,它查看 9 种不同的可能性并相应地选择一个具有以下形式的动作:

我正在做的是查找一个向量,并为向量中的每个条目决定

IF the value in the vector is 1 THEN start function B
IF the value in the vector is 2 THEN start function C
IF the value in the vector is 3 THEN start function D
IF the value in the vector is 4 THEN start function E

等等

我想用 R 写这个。我是否只为每个案例都加上“else”?

我尝试switch过以下方式:

condition<-6
FUN<-function(condition){
    switch(condition,
    1 = random1(net)
    2 = random2(net)
    3 = random3(net)
    4 = random4(net)
    5 = random5(net)
    6 = random6(net)
    7 = random7(net)
    8 = random8(net)
    9 = random9(net)
    10= random10(net))
}

其中随机 1 到 10 是使用变量“net”的函数

并且该switch命令试图做的是检查“条件”的值,如果它是上面例子中的 6,那么它运行该函数:random6(net)

4

3 回答 3

6

两个答案都为您指出了正确的工具,但恕我直言,事情应该这样写。到目前为止,OP 和两种解决方案都在创建使用全局变量 ( net) 的函数,这不是最佳实践。

假设randomX是一个参数的函数net,即:

random1 <- function(net){ [...] }
random2 <- function(net){ [...] }
[etc.]

然后你需要做:

FUN <- switch(condition,
              '1' = random1,
              '2' = random2,
              [etc.])

或更好:

FUN.list <- list(random1, random2, [etc.])
FUN <- FUN.list[[condition]]

在这两种情况下,输出都是一个作为输入的函数net(就像randomX),因此您可以通过执行以下操作对其进行评估:

FUN(net)

另请注意,您可以使用第二种方法一次性完成所有操作:

FUN.list[[condition]](net)
于 2012-12-20T14:20:39.493 回答
5

另一种解决方案是将要调用的所有函数打包到一个列表中randoms,然后根据以下内容选择一个列表项condition

randoms <- list(random1, random2, random3, random4, random5, random6, random7, random8, random9, random10)
FUN <- function(condition) {
  randoms[[condition]](net)
}
于 2012-12-20T13:56:24.507 回答
4

使用switch函数如下:

foo <- function(condition){
  switch(condition,
         '1' = print('B'),
         '2' = print('C'),
         '3' = print('D'),
         '4' = print('E'))
}

> foo(1)
[1] "B"
> foo(2)
[1] "C"
> foo(3)
[1] "D"
> foo(4)
[1] "E"

更多细节在?switch

根据您的示例:

condition<-6
FUN<-function(condition){
    switch(condition,
    '1' = random1(net), # Maybe you're missing some commas here
    '2' = random2(net), # and here
    '3' = random3(net), # and here
    '4' = random4(net)
    ....) # all the way to '10' = random10(net)
}

这会成功的

这对我很有效:

Foo <- function(condition){
  x <- 1:20
  switch(condition,
         '1' = mean(x),
         '2' = var(x),
         '3' = sd(x))
}

> Foo(1)
[1] 10.5
> Foo(2)
[1] 35
> Foo(3)
[1] 5.91608
于 2012-12-20T12:54:39.953 回答