2016-09-20 32 views
-2

這與data.table objects not printed after returned from function有關,但不是一個騙局。這個問題是專門尋找一種在repl上使用分配:= data.table行時不抑制輸出的方法。所以在eval會導致R調用打印方法的情況下。一個選項不能抑制輸出:=在data.table中賦值

我已經升級並注意到:=現在不可見。當我使用交互式工作流進行開發時,會在構建管道時中斷流程,添加作業:=一行,然後期望看到結果用作上下文來添加額外步驟。

當然我可以將[]添加到賦值行,但是在意識到我的賦值行沒有打印之後(因爲我之前沒有這樣做),所以我的流程在添加之前就被打亂了。或者,有人可能會爭辯說,我應該總是使用每個賦值行來處理[],這樣我的流程就不會中斷,但是我必須記住只爲賦值行執行此操作,並且由於流水線通常會將分配與過濾器混合在一起實踐中會引入額外的認知開銷 - 對最終用戶而言 - 感覺不必要,並且在流水線中逐行進行時看起來不一致。

我不想爭論選擇不可見或不可見的返回,因爲我已經對此進行了充分討論,並且已經爲大多數人和用例做出了正確的決定。相反,是否有我可以設置的選項或解決方法使:=不可見?

+1

這是一個相關的討論http://stackoverflow.com/questions/15267018/ knitr-gets-tricked-by-data-table-assignment –

+3

你升級了哪個版本? ':='現在已經無形地返回了很多*年*。最後加入'[]'是我知道的最簡單的選項。 – eddi

+0

@ Eddie 1.9.6至1.9.6 :)。我還升級了R,vim,vim-r,tmux,並且我在一臺新機器上。所以我以前的設置中的某些東西實際上允許這種行爲在1.9.6中持續存在。我認爲這是因爲這是對data.table的改變,這個問題可能與其他「升級」的問題相關。與此同時,我正在系統地嘗試查看我的設置中發生了什麼變化,以便我可以將此用於解決方法的靈感。 –

回答

2

1.9.6中的一種方法是修補print.data.table S3方法。

在調用原始方法之前,將.global $ print值設置爲「」(默認值)。這解除了在data.table想要不可見地返回(例如,賦值:=行)的情況下,在調用通用打印方法(使用動態作用域規則)之前,該值如何更改。

效果是仍然調用data.table的自定義打印方法,但data.table不再嘗試修改R的默認邏輯以決定何時以及何時不打印。

可能是一個天真的解決方案,因爲我還在學習包,命名空間,環境,S3方法等

library(data.table) 
print.data.table.orig = get('print.data.table', envir=asNamespace('data.table')) 
print.data.table.patch = function(x, ...) { 
    .globalRef = get('.global', envir=asNamespace('data.table')) 
    .globalRef$print = "" 
    print.data.table.orig(x, ...) 
} 

library(R.methodsS3) 
setMethodS3('print', 'data.table', print.data.table.patch) 


fTbl = data.table(x=1:500000) 
fTbl[, x := 5] 
     x 
    1: 5 
    2: 5 
    3: 5 
    4: 5 
    5: 5 
    --- 
499996: 5 
499997: 5 
499998: 5 
499999: 5 
500000: 5 

fTbl 
     x 
    1: 5 
    2: 5 
    3: 5 
    4: 5 
    5: 5 
    --- 
499996: 5 
499997: 5 
499998: 5 
499999: 5 
500000: 5 
>