2015-11-11 26 views
1

我有一个函数可以一次运行一次模拟。它创建一个0和1的矩阵,然后检查'TIC TAC TOE'胜利。我希望能够重复那个函数'n'次。这里是我的代码...在函数中重复函数R

function (SimSize,nrow,ncol) 
{ 
count.win = 0 
#Beginning Grand Loop 
for(i in 1:SimSize){ 

#creating TicTacToe board of 1s and 0s 
game = matrix(sample(c(0,1),replace=T,size = nrow*ncol),nrow=nrow) 

#Check for any wins 

if(any( 
any(colSums(game)==ncol), 
any(rowSums(game)==nrow), 
any(sum(diag(game))==ncol), 
any(sum(diag(apply(game,2,rev)))==ncol)) 
) 
count.win = count.win+1 
} 
#calculate the probability of a win per simulation size 
p.win = count.win/SimSize 
out = list(SimSize,count.win,p.win) 
out 
} 

我想能够在最后绘制SimSize vs count.win图。但要做到这一点,我需要选定的SimSize运行'n'次。任何帮助?

+1

看看'replicate(n,function)'重复一次函数'n'次 –

回答

1

如果我假设你分配你的功能tictac<-function(SimSize,nrow,ncol) {}

那么你可以简单地做

results<-lapply(1:100,function(x) tictac(x,3,3))

你想改变你的功能,使得它的唯一输出count.win

0
tictactoe_simulation <- function (sim_size, n_row, n_col) { 
    count.win = 0 

    #Beginning Grand Loop 
    for(i in 1:sim_size){ 
    #creating TicTacToe board of 1s and 0s 
    game = matrix(sample(c(0,1),replace=T,size = nrow*ncol),nrow=nrow) 

    #Check for any wins 
    if(any( 
     any(colSums(game)==ncol), 
     any(rowSums(game)==nrow), 
     any(sum(diag(game))==ncol), 
     any(sum(diag(apply(game,2,rev)))==ncol)) 
    ) 
     count.win = count.win+1 
    } 
    #calculate the probability of a win per simulation size 
    p.win = count.win/SimSize 
    out = list(SimSize,count.win,p.win) 
    out 
} 
replicate(10, tictactoe_simulation(10,3,3)) 

另一种解决方案可能是闭包,您可以在外部函数中定义r并且在内部为模拟设置。 see

此外,我会建议命名你的变量在camelCase或下划线。特别是在基本功能nrowncol的情况下。