2017-08-29 22 views
0

我想編寫一個井字遊戲。R如何在井字遊戲中定義[]函數?面向對象編程

print(state) 

1 | 2 | 3 
--------- 
4 | 5 | 6 
--------- 
7 | 8 | 9 

我如何定義[]功能,使下面的代碼工作:

state[5] <- "x" 
state 

1 | 2 | 3 
--------- 
4 | x | 6 
--------- 
7 | 8 | 9 

下面是我的完整代碼:

state <- as.character(c(1:9)) 
ttt<-function(state=NULL) 
{ 
    if(is.null(state)==TRUE) 
    state<-character(9) 
    state<-as.character(state) 
    rtrn<-list() 
    class(rtrn)<-"ttt" 
    rtrn$state<-state 
    return(rtrn) 
} 
state<-ttt(state) 
print.ttt<-function(ttt) 
{ 
    state<-ttt$state 
    print(cat(state[1]," | ",state[2]," | ",state[3],"\n",state[4]," | ",state[5]," | ",state[6],"\n",state[7]," | ",state[8]," | ",state[9],"\n",sep="")) 
} 
state 

print功能工作。是。但

state[2]<-"x" ##this code do not work, I don't know how to program [] function in this case 
+1

我會建議問兩個單獨的問題,對於'print'和'['''''來說答案會有很大的不同。總之,對於'print',我很困惑你爲什麼被卡住。你有嘗試過什麼嗎?對於''',實現你自己的方法可能會很複雜,但是如果你讓你的'ttt'類繼承自一個向量或矩陣,你應該只能使用默認的方法。 – Gregor

+0

是的,對於「打印」,我可以做到這一點。但在這種情況下,我想使用一個類。所以我不知道如何在一個類中使用這兩個函數 –

+0

R中的方法沒有在類中定義,你只需要創建一個'print.ttt'函數,它會在你執行'print()狀態)'或'狀態'。你所要做的就是編寫函數並適當地命名它。如果您以某種方式編寫了該功能並仍然有問題,請將您的代碼置於該問題中。 – Gregor

回答

1

正如我在評論中提到的,而不是編碼自己的自定義[[<-方法,我們就可以進行從特徵向量類的ttt類繼承的方法。我這裏簡化代碼:

ttt <- function(state) { 
    if (missing(state)) { 
     state <- as.character(1:9) 
    } 
    class(state) <- c(class(state), "ttt") 
    return(state) 
} 

關鍵的新成員class(state) <- c(class(state), "ttt"),我們不更換舊的類,我們只是添加到它。我們仍然會提供我們自己的print.ttt方法,但是我們不提供的任何功能將回退到character的默認值。

print.ttt <- function(ttt) { 
    seps <- rep(c(" | ", " | ", "\n"), 3) 
    cat(as.vector(rbind(ttt, seps)), sep = "") 
    invisible(ttt) 
} 

我也簡化了打印。現在讓我們來看看它是如何工作的:

> game <- ttt() 
> game 
1 | 2 | 3 
4 | 5 | 6 
7 | 8 | 9 

> game[5] <- 'x' 
> game 
1 | 2 | 3 
4 | x | 6 
7 | 8 | 9 

> game[1] <- 'o' 
> game 
o | 2 | 3 
4 | x | 6 
7 | 8 | 9