如何对不在'内部的功能进行矢量化。但是'外面'在R?

时间:2014-03-22 20:13:50

标签: r vectorization

我正在尝试在R中编写tic-tac-toe - 这是我的两个函数,用于移动和评估所有有效的移动(X是' s,零是O' s和{{ 1}}尚未拍摄):

NA

现在设置一个测试位置,评估所有有效的移动,然后进行这些移动......

move <- function(board,square,mark)
{
  if (square < 1 || square > 9 || !is.na(board[square]))
  {
    return(NA)
  }
  else
    board[square] <- mark
    return(board)
}

valid.moves <- function(board)
{
  return(which(is.na(board)))
}

...给出了我并不打算的结果:

test.last <- matrix(c(1,1,NA,0,NA,0,NA,0,1),nrow=3)
moves <- valid.moves(test.last)
move(test.last,moves,1)

我希望三个不同的电路板具有相应的有效移动(然后将使用另一个功能评估它是否为获胜位置)并且不是一个具有所有有效移动的电路板马上

我不想用循环来做这件事但是矢量化不应该一次全部发生在&#39;内部&#39; [,1] [,2] [,3] [1,] 1 0 1 [2,] 1 1 0 [3,] 1 0 1 功能,但&#39;外部&#39;它 - 所以基本上我想在没有循环的情况下执行以下操作(move函数来评估位置的格式为eval.pos):

eval.pos <- function(board){}

如何在没有循环的情况下完成此操作?

2 个答案:

答案 0 :(得分:1)

move2 <- function(board, square, mark) {
  lapply(square, function(x,i,value) `[<-`(x,i,value), x=board, value=mark) 
}

请注意,需要匿名function(),因为[<-是原始的。

答案 1 :(得分:1)

在评论中扩展我的建议。如何使用矩阵索引生成移动选项列表:

 valid.moves <- function(board)
 {
     return(which(is.na(board), arr.ind=TRUE))
 }

> moves <- valid.moves(test.last)
> moves
     row col
[1,]   3   1
[2,]   2   2
[3,]   1   3

> lapply(1:3, function( mv) {start <- test.last 
                             start[matrix(moves[mv,],ncol=2)] <- 1
                             start})
[[1]]
     [,1] [,2] [,3]
[1,]    1    0   NA
[2,]    1   NA    0
[3,]    1    0    1

[[2]]
     [,1] [,2] [,3]
[1,]    1    0   NA
[2,]    1    1    0
[3,]   NA    0    1

[[3]]
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    1   NA    0
[3,]   NA    0    1