如何将函数矢量化而不是';内部';但是';外部';在R?
我尝试在R中编程-以下是我的两个函数,用于移动和评估所有有效移动(其中一个是X,零是O,而如何将函数矢量化而不是';内部';但是';外部';在R?,r,vectorization,R,Vectorization,我尝试在R中编程-以下是我的两个函数,用于移动和评估所有有效移动(其中一个是X,零是O,而NA尚未执行): 我希望有三个不同的板,分别具有有效的移动(然后将使用另一个函数来评估是否为获胜位置),而不是一个板同时具有所有有效的移动 我不想使用循环来实现这一点,但是向量化不应该在move函数的“内部”同时发生,而是在它的“外部”——因此,基本上我想在不使用循环的情况下完成以下操作(用于评估位置的eval.pos函数的形式为eval.posmove2扩展我在评论中的建议。如何使用矩阵索引生成移动选项列
NA
尚未执行):
我希望有三个不同的板,分别具有有效的移动(然后将使用另一个函数来评估是否为获胜位置),而不是一个板同时具有所有有效的移动
我不想使用循环来实现这一点,但是向量化不应该在
move
函数的“内部”同时发生,而是在它的“外部”——因此,基本上我想在不使用循环的情况下完成以下操作(用于评估位置的eval.pos
函数的形式为eval.posmove2扩展我在评论中的建议。如何使用矩阵索引生成移动选项列表:
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
valid.moves
行列
[1,] 3 1
[2,] 2 2
[3,] 1 3
>lappy(1:3,函数(mv){开始,尽管这只是一个mappy
,请参阅-也许-类似矢量化(move,“square”,SIMPLIFY=F)(test.last,moves,1)
在这种情况下,它返回一个长度为3的向量。您可能会更幸运地使用arr.ind=TRUE选项,这样您就可以识别矩阵索引。@IShouldBuyABoat:我试过了,但我发现这个解决方案更容易一些,因为您只有一个数字作为坐标。如果其中一个答案“有效”对你来说,你需要勾选它。否则人们会认为还有一个未解决的问题。@IShouldBuyABoat:谢谢,我很清楚这个系统是如何工作的;-)+1:非常感谢。我如何直接使用函数的输出作为我的eval.pos
函数的输入,该函数的形式为eval.poslappy
返回一个列表;我想您也可以将其用于eval.pos
例如lappy(X,eval.pos)
由于X
是move2
的结果,这也行。有点笨重的是,现在所有这些列表都作为容器。你认为有没有一种解决方案可以像标准向量化(也不使用列表作为容器)一样,在没有列表的情况下使用相同的技巧?@vonjd likesapply
?@rawr:老实说,整个“应用”函数家族仍然让我感到困惑!我只想在做出相应的有效移动后得到所有评估板位置的向量:eval.pos(move2(test.last,moves,1))
+1:谢谢!我发现这个解决方案也有点笨重,就是现在有一个列表作为容器。你认为有没有一个解决方案可以在没有列表的情况下执行与标准矢量化(也不使用列表作为容器)相同的技巧?我只想在进行相应的有效移动后得到所有评估板位置的向量:eval.pos(move2(test.last,moves,1))
列表是唯一可以在一个有用的包中提供三个独立矩阵的结构。如果你使用sapply
你会得到一个9 x 3的矩阵,这对于我猜你想做的评估来说似乎不是很自然。或者你只是在创建随机移动?
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)
[,1] [,2] [,3]
[1,] 1 0 1
[2,] 1 1 0
[3,] 1 0 1
for (i in 1:length(moves))
{
after.moves <- move(test.last,moves[i],1)
print(after.moves)
print(eval.pos(after.moves))
}
move2 <- function(board, square, mark) {
lapply(square, function(x,i,value) `[<-`(x,i,value), x=board, value=mark)
}
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