使用 %in% 与列表进行匹配

Matching against a list using %in%

提问人:FB001 提问时间:8/5/2023 最后编辑:FB001 更新时间:8/5/2023 访问量:55

问:

我正在编写一个可以用来玩“石头、纸、剪刀、蜥蜴、斯波克”的函数。我曾经要求用户选择一个选项,给计算机一个选项,并定义如果两个选项匹配 10 个获胜对中的一个,就会发生胜利。代码有效(如,不会引发错误),但会产生意外的输出。我不明白为什么这不起作用,我认为这与我不明白的细微差别有关。menu()sample()%in%list

choices <- c("rock", "paper", "scissors", "lizard", "spock")

# Scissors [3] beats paper [2], 
# paper [2] beats rock [1], 
# rock [1] beats lizard [4], 
# lizard [4] beats Spock [5],
# Spock [5] beats scissors [3], 
# scissors [3] beats lizard [4], 
# lizard [4] beats paper [2], 
# paper [2] beats Spock [5], 
# Spock [5] beats rock [1], 
# rock [1] beats scissors [3].

wins <- list(c(3, 2), c(2, 1), c(1, 4), c(4, 5), c(5, 3), c(3, 4), c(4, 2), c(2, 5), c(5, 1), c(1, 3))

fun <- function(){
  input <- menu(choices, title="Choose one:")
  if (input == 0){
    message("You have to pick a valid choice to play this. Try again.")
  }
  if (input >= 1 && input <= 5){
    comp_choice <- sample(1:5, 1)
    message(paste0("you chose ", choices[input]))
    message(paste0("computer chose ", choices[comp_choice]))
    print(list(c(input, comp_choice)) %in% wins)
    if (input != comp_choice){
      if (list(c(input, comp_choice)) %in% wins) {
        message("you won")
        } 
      else message("you lost")
    }
    else message("it's a draw")
  }
}

fun()

意外输出示例(应该是胜利):

Selection: 3
you chose scissors
computer chose lizard
[1] FALSE
you lost
R 列表 匹配

评论

0赞 Mark 8/5/2023
如果使用随机过程,例如采样,则应将 set.seed(0) 添加到代码的开头
0赞 joran 8/5/2023
我写了一条错误的第一条评论,基于对 u 函数的一行的快速误读。但你是对的,与列表一起使用正在做一些你意想不到的事情。事实上,这是一件非常鬼鬼祟祟的奇怪事情。尝试插入 print 语句,即 并运行该函数几次。你很快就会注意到一些奇怪的事情发生。这很复杂,但您会注意到,文档说列表首先转换为字符。%in%print(as.character(list(c(input,comp_choice)))match
0赞 Mark 8/5/2023
问题与 R 中一些与类型相关的卡顿有关。如果将行更改为 ,则它可以工作list(as.numeric(c(input, comp_choice))) %in% wins
0赞 joran 8/5/2023
引擎盖下发生的事情有点奇怪,但底线是,正如文档所建议的那样,在列表上使用匹配是一个坏主意,除非在非常非常简单的情况下。最好将你的对编码为显式字符,如“34”、“12”等,或者使用矩阵。
1赞 joran 8/5/2023
终于找到了我知道存在的问题,指的是这个确切的东西(当然,具有讽刺意味的是,我问了这个问题)。

答: 暂无答案