2014 年 10 月更新。現在 data.table v1.9.5 にあります:
:=
knitr
プロンプト#505での動作との一貫性のために、出力されなくなりました。テストの出力は、knit("knitr.Rmd")
data.table の単体テストに含まれるようになりました。
および関連:
if (TRUE) DT[,LHS:=RHS]
現在は印刷されません (Jureiss さん、#869に感謝)。テストが追加されました。これを機能させるには、1 つの欠点を受け入れる必要がありました。関数の最後に:=
no を付けて関数内で a を使用すると、プロンプトでDT[]
次回入力しても何も出力されません。DT
繰り返しDT
印刷されます。これを回避するには、関数DT[]
の最後:=
に a を含めます。それが不可能な場合 (たとえば、変更できる関数ではない場合) print(DT)
、DT[]
プロンプトで印刷されることが保証されます。[]
以前と同様に、クエリの最後にエクストラを追加すること:=
は、更新してから印刷するための推奨されるイディオムです。例えば> DT[,foo:=3L][]
以前の回答は後世のために保持されています(global$depthtrigger
data.table v1.9.5以降、ビジネスは行われなくなったため、これは当てはまりません)...
明確にするために、私は理解しています:knitr
あなたがしたくないときに印刷しています。
data.table:::.global$depthtrigger
スクリプトの開始時に少し増やしてみてください。
これは現在あなたにとって3つになります:
data.table:::.global$depthtrigger
[1] 3
knitr
評価の深さがスタックにどれだけ追加されるかはわかりません。ただし、最初にトリガーを 4 に変更してみてください。すなわち
assign("depthtrigger", 4, data.table:::.global)
スクリプトの最後で、knitr
必ず 3 に戻してください。4 でうまくいかない場合は、5 を試してから 6 を試してください。10 になったらあきらめて、もう一度考えます。;-P
なぜこれがうまくいくのでしょうか?
v1.8.4 からのニュースを参照してください。
DT[,LHS:=RHS,...]
印刷されなくなりましたDT
。これは #2128 "Try again to get DT[i,j:=value]
to get invisibly" を実装します。ここでの議論のおかげで:
v1.8.3 より前の R {data.table} で `:=` を使用するときに出力を抑制する方法は?
http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html
FAQ 2.21 および 2.22 が更新されました。
FAQ 2.21 なぜ DT[i,col:=value] は DT 全体を返すのですか? 目に見える値がない (<- と一致する) か、更新された行数を含むメッセージまたは戻り値のいずれかを期待していました。データが実際に参照によって更新されたかどうかは明らかではありません。
これは、期待に応えるために v1.8.3 で変更されました。アップグレードしてください。複合構文が機能するように、DT の全体が (現在は見えないように) 返されます。例: DT[i,done:=TRUE][,sum(done)]。詳細がオンの場合、更新された行数は、クエリごとに、またはオプション (datatable.verbose=TRUE) を使用してグローバルに返されます。
FAQ 2.22 わかりました、ありがとう。DT[i,col:=value] の結果が見えずに返されることの何がそんなに大変だったのですか?
R は [ の可視性を内部的に強制します。FunTab の eval 列 (src/main/names.c を参照) の [ の値は 0 であり、強制的に R_Visible をオンにすることを意味します (R-Internals セクション 1.6 を参照)。したがって、invisible() を試したり、R_Visible を直接 0 に設定したりすると、src/main/eval.c の eval が再び強制的にオンになります。この問題を解決するための鍵は、:= の後で実行中の print メソッドを停止しようとするのをやめることでした。代わりに、:= 内で (v1.8.3 以降) グローバル フラグを設定し、print メソッドが実際に印刷するかどうかを知るために使用します。
そのグローバル フラグはdata.table:::.global$print
. 上部に、data.table:::print.data.table
それを見ていることがわかります。[
これは、 (FAQ 2.22 で説明されているように)からの印刷を抑制する既知の方法がないためです。
したがって、内部:=
で[.data.table
は、この呼び出しがどれほど「深い」かを確認できます。
if (Cstack_info()[["eval_depth"]] <= .global$depthtrigger) {
suppPrint = function(x) { .global$print=FALSE; x }
# Suppress print when returns ok not on error, bug #2376.
# Thanks to: https://stackoverflow.com/a/13606880/403310
# All appropriate returns following this point are
# wrapped i.e. return(suppPrint(x)).
}
重要なことは、 がプロンプトで実行されている場合、REPL が自分の制御を超えて結果DT[,x:=y]
のメソッドを呼び出すことを知っているということです。print
特定のメソッドが実行されるので、フラグを設定しprint
てそのメソッド内でそれを抑制します (実行するメソッド (つまり) は私が制御できるものであるため)。print
print
print.data.table
knitr
の場合、巧妙な方法で REPL をシミュレートしています。それは実際にはスクリプトではありませんDT[,x:=y]
。しかし、 を介して REPL をシミュレートしているため、から実行されるコードの深さがeval
さらに深まります。または似たようなもの(わかりません)。eval
knitr
knitr
depthtrigger
そのため、を増やすとうまくいくかもしれないと考えています。
ハック/粗雑、同意します。しかし、それが機能し、どの値が機能するかを教えていただければ、認識して自動的に変更data.table
することができます。または、より良い解決策があれば大歓迎です。knitr
depthtrigger