我想用字符向量和switch语句进行查找引用,但是我一直收到错误。我想我在玩规则。看看你的想法。
我使用开关功能的方式如下所示。我有一个数字向量'a'和一个字符向量'b'。无论第一个参数是否为字符串或数字,switch函数的行为都不同。
在前两个switch语句中,第一个参数求值为数字。因此switch将获取该数字并尝试返回switch语句中的(number + 1)参数。所以在第一个例子中我们有一个[2]作为第一个参数,它的计算结果为2,所以我们在switch语句中寻找第(2 + 1)个参数 - 即5.第二个例子使用不同的数字向量a的索引作为switch语句中的参数。
在后两个switch语句中,第一个参数是字符向量b的索引,它的计算结果为字符串。当第一个参数是字符串时,switch语句将在其他参数的名称中查找完全匹配的字符串。如果它在参数名称中找到完全匹配,则计算该语句。
所以看第三个例子,b [2]计算字符串“2”,它与第三个参数完全匹配。
此问题与第四个示例有关。 b [2]求值为字符串“2”,并且应该与字符串b [2]匹配,但事实并非如此。它会引发错误。
a <- 1:3
b <- as.character(1:3)
switch(a[2], 4, 5, 6) # returns 5
switch(a[2], a[1], a[2], a[3]) # returns 2
switch(b[2], "1"=1, "2"=2, "3"=3) # returns 2
switch(b[2], b[1]=1, b[2]=2, b[3]=3) #Error: unexpected '=' in "switch(b[2], b[1]="
#yet....
b[2] == "2" #TRUE and the third switch statement had no problem with "2"??
答案 0 :(得分:1)
b[1]=1
确实试图将1
分配给我认为的b
的第一个元素,这在这种情况下无效。您希望将一个命名对象作为参数传递给switch()
,就像您在示例3中一样。
switch(b[2], "1"=1, "2"=2, "3"=3)
#[1] 2
要以编程方式构建,可以使用do.call
:
do.call(switch, c(b[2], setNames(list(1,2,3), b[1:3])) )
#[1] 2
使用如下所示的参数调用switch()
,这将与示例3相同,它起作用:
c(b[2], setNames(list(1,2,3), b[1:3]))
#[[1]]
#[1] "2"
#
#$`1`
#[1] 1
#
#$`2`
#[1] 2
#
#$`3`
#[1] 3