39

それがドキュメントへの出力につながるべきでknitrはないことを理解していないようです。この動作を停止する方法はありますか?DT[, a:=1]DT

サンプルknitrドキュメント:

Data.Table Markdown
========================================================
Suppose we make a `data.table` in **R Markdown**
```{r}
DT = data.table(a = rnorm(10))
```
Notice that it doesn't display the contents until we do a
```{r}
DT
```
style command.  However, if we want to use `:=` to create another column
```{r}
DT[, c:=5]
```
It would appear that the absence of a equals sign tricks `knitr` into thinking this 
is to be printed.

ニット出力:

ここに画像の説明を入力してください

これはバグですかknitr、それともdata.tableバグですか?

編集

私はちょうど気づいたばかりです、それがコードを実行knitrしているとき、それは奇妙echoです。上記の出力を見てください。私のソースコードにはありますDT[, c:=5]が、knitrレンダリングされるのは

DT[, `:=`(c, 5)]

変...

編集2:キャッシング

キャッシングにも問題:=があるようですが、それは別の原因である必要があるため、ここで別の質問があります。data.table`:=`でknitrキャッシングが失敗するのはなぜですか。

4

5 に答える 5

20

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$depthtriggerdata.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てそのメソッド内でそれを抑制します (実行するメソッド (つまり) は私が制御できるものであるため)。printprintprint.data.table

knitrの場合、巧妙な方法で REPL をシミュレートしています。それは実際にはスクリプトではありませんDT[,x:=y]。しかし、 を介して REPL をシミュレートしているため、から実行されるコードの深さがevalさらに深まります。または似たようなもの(わかりません)。evalknitrknitr

depthtriggerそのため、を増やすとうまくいくかもしれないと考えています。

ハック/粗雑、同意します。しかし、それが機能し、どの値が機能するかを教えていただければ、認識して自動的に変更data.tableすることができます。または、より良い解決策があれば大歓迎です。knitrdepthtrigger

于 2013-03-07T10:13:22.490 に答える
7

なぜ使用しないのですか:

```{r, results='hide'}
DT[, c:=5]
```
于 2014-08-19T19:49:34.410 に答える
2

式を invisible() で囲むだけです。これは私にとってはうまくいきます。

于 2015-05-09T08:17:16.307 に答える