gpt4 book ai didi

r - R中是否有类似于Rust模式语法的内容?

转载 作者:行者123 更新时间:2023-12-03 11:28:22 25 4
gpt4 key购买 nike

我知道R中的switch语句,但是我很好奇是否有一种方法可以将相同的 Action /值分配给同一支臂中的多个模式,类似于Rust中的方式:

let x = 1;
match x {
1 | 2 => println!("one or two"),
3 => println!("three"),
_ => println!("anything"),
}
我不需要为1和2编写两个单独的案例,只需将它们用'|'组合为一个。如果之前没有匹配的模式,我可以定义默认大小写(_),这也将很有帮助。

最佳答案

没有分配的前面的值会一直保留,直到找到分配的值。

switch(
as.character(x),
"1"=,
"2"="one or two",
"3"="three",
"anything"
)
我使用 as.character(x)而不是 x,因为 EXPR(第一个参数)可能被解释为位置信息,而不是相等信息。从 ?switch:
     If the value of 'EXPR' is not a character string it is coerced to
integer. Note that this also happens for 'factor's, with a
warning, as typically the character level is meant. If the
integer is between 1 and 'nargs()-1' then the corresponding
element of '...' is evaluated and the result returned: thus if the
first argument is '3' then the fourth argument is evaluated and
returned.
因此,如果 x是介于1和其他参数个数之间的整数,则它将被解释为位置指示符,如
switch(3, 'a','z','y','f')
# [1] "y"
这就意味着命名参数将被有效地忽略,例如在这个非常令人困惑的示例中
switch(3, '1'='a','3'='z','2'='y','4'='f')
# [1] "y"
请注意,该帮助不会引用大于 nargs()-1的非字符串...这些整数返回null:
(switch(9, '1'='a','3'='z','2'='y','4'='f'))
# NULL
由于它是您要匹配的整数的值,因此需要混淆地转换为字符串:
switch(as.character(3), '1'='a','3'='z','2'='y','4'='f')
# [1] "z"

或者,
dplyr::case_when(
x %in% 1:2 ~ "one or two",
x == 3 ~ "three",
TRUE ~ "anything"
)
# [1] "one or two"
或者
data.table::fcase(
x %in% 1:2 , "one or two",
x == 3 , "three",
rep(TRUE, length(x)), "anything"
)
(对 rep(TRUE,length(x))的需求是因为 fcase要求所有参数的长度都完全相同,即,它不允许许多R函数允许的回收。我个人更希望它们允许 1 or N回收而不是 only N,但这不是这样在这一刻。)
这具有自然地矢量化的优点。 switch仅支持length-1。向量 x的解决方法可能是
sapply(x, switch, '1'='a', '3'='z', '2'='y', '4'='f')
(或者,更好的是, vapply强制返回 class)。

关于r - R中是否有类似于Rust模式语法的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66410401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com