2013-04-13 27 views
4

我在R中試驗陰謀,我試圖理解爲什麼它有以下行爲。與R中的陰謀結果不一致

我發送一個表到plot函數中,它給了我一個非常好的variwidth圖,這非常有洞察力。但是,在我重新排列表格的列並將其再次發送到繪圖後,我會得到一個奇怪的散點圖。重新排序中發生了什麼,我該如何避免這種情況?

smoke <- matrix(c(51,43,22,92,28,21,68,22,9),ncol=3,byrow=TRUE) 
colnames(smoke) <- c("High","Low","Middle") 
rownames(smoke) <- c("current","former","never") 
smoke <- as.table(smoke) 
plot(smoke) # This gives me a variwidth plot 
smoke = smoke[,c("Low", "Middle", "High")] # I reorder the columns 
plot(smoke) # This gives me a weird scatter plot 

回答

4

當你重新排序列,您改變了類「煙」從「表」,以「矩陣」,這樣的情節,它返回不同的默認效果取決於它的輸入,返回不同的情節。

嘗試:

plot(as.table(smoke)) 
5

調查這一問題的方法是對「如煙」的兩個實例做STR():

> str(smoke) 
table [1:3, 1:3] 51 92 68 43 28 22 22 21 9 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:3] "current" "former" "never" 
    ..$ : chr [1:3] "High" "Low" "Middle" 

> str(smoke[,c("Low", "Middle", "High")]) 
num [1:3, 1:3] 43 28 22 22 21 9 51 92 68 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:3] "current" "former" "never" 
    ..$ : chr [1:3] "Low" "Middle" "High" 

第一個是表對象,而第二on是一個矩陣。你也可以在兩者上完成class()並獲得更緊湊的答案。要理解爲什麼這是重要的還看

methods(plot) 

....,看到有一個plot.table*方法。該「*」表示它不是「看得見的」,並且是你需要看到你將需要使用的代碼:

getAnywhere(plot.table) 

由於阿南達已經表明,你可以將表類恢復到煙對象然後讓調度系統發送對象到plot.table*

+0

對不起。將更正。 –

+0

我對某件事感到好奇,也許你可以將我指向正確的方向。假設我們改變了「煙霧」類,如下所示:class(s​​moke)< - c(class(s​​moke),「table」)'。 R現在使用'plot.table'方法繪圖。類的順序*是否重要(至少在這種情況下,它似乎不是)?或者是沒有特定的'plot.matrix'方法? – A5C1D2H2I1M1N2O1R2T1

+0

調度方法按順序搜索第一個類,直到找到與命名方法相匹配的類,但沒有plot.matrix方法。有一個'plot.default'方法'捕捉'矩陣對象。 –