我有一个查看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中写这个。我只是把"否则"对于每一个案例?
我已按以下方式尝试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是使用变量&#39; net&#39;
的函数以及switch
命令尝试执行的操作是检查&#39; condition&#39;的值。如果它的6如上例所示那么它运行函数:random6(net)
答案 0 :(得分: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)
答案 1 :(得分:5)
另一个解决方案是将您要调用的所有功能打包到列表randoms
中,然后根据condition
选择一个列表项:
randoms <- list(random1, random2, random3, random4, random5, random6, random7, random8, random9, random10)
FUN <- function(condition) {
randoms[[condition]](net)
}
答案 2 :(得分: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