2013-03-12 2 views
13

Sto utilizzando la funzione fread introdotta di recente da data.table per leggere i file di dati. Quando mi avvolgo il mio codice in un documento knitr (Rmd), ho notato qualche strano uscita, vale a dire le linee piace:Uscita strana da fread quando chiamata da knitr

## 
0% 

anche se la possibilità di verbosefread stata impostata su false. Ho usato sink per nascondere questo output, ma mi piacerebbe segnalare il problema esatto agli autori del pacchetto. Ecco un esempio minimale,

library(knitr) 

test = "```{r} 
require(data.table) 
fread('1 2 3\n') 
```" 
knit2html(text=test, output="test.html") 
browseURL("test.html") 

Qual è l'uscita 0%?

+1

Non riesco a riprodurre l'output. Non ho '0% '. Quale versione di 'data.table' stai usando? – agstudy

+0

Lo vedo (data.table_1.8.8 e knitr_1.1). Puoi vederlo anche con 'kint (text = test)' che fornisce '[1]" \ n'''r \ nrequire (data.table) \ nfread (\ "1 2 3 \\ n \") \ n''' \ n \ n''' \ n ## \ r0% \ r \ r \ n''' \ n \ n''' n n ## V1 V2 V3 \ n ## 1: 1 2 3 \ n''' \ n "'. La parte interessante è che '##' e '0%' terminano con '\ r', non' \ n'. Sembra una sorta di barra di avanzamento che viene rapidamente sovrascritta. Ma 'knitr' sta trattando i ritorni a capo (' \ r') come le estremità delle linee ('\ n') e quindi ognuno di loro ottiene la propria linea. –

+0

Sto usando le ultime versioni di CRAN, data.table_1.8.8 e knitr_1.1 – baptiste

risposta

15

È un contatore di avanzamento%. Per me stampa 0%, 5%, 10%, ... 95%, 100% (ad esempio) con un \r alla fine per farlo comparire su una riga appena sotto la chiamata a fread quando viene digitato al prompt.

Ma quando chiamato da funzioni, batch e knitr questo non è desiderabile. Questo è stato rimosso. News per v1.8.9 (rev 851):

  • % metro console progresso è stato rimosso. L'output era scomodo in modalità batch, file di registro e report che non gestiscono \r. È stato troppo difficile individuare da dove viene chiamato il numero fread, inoltre la sua rimozione accelera un po 'il fread salvando il codice all'interno del ciclo C for (che è il motivo per cui non è stato reso opzionale). Utilizzare il monitor di sistema del sistema operativo per confermare che l'avanzamento è in corso. Grazie a Baptiste per evidenziare:
    Strange output from fread when called from knitr

Solo un rapido promemoria per completezza. Dalla cima del ?fread:

Questa funzione è ancora in fase di sviluppo. Ad esempio, le date vengono lette come carattere (possono essere convertite in seguito utilizzando l'eccellente pacchetto fasttime o le funzioni di base standard) e le citazioni incorporate ("\" " e" "" ") hanno problemi. non sono stato risolto e non funzioni ancora attuato. Ma, si potrebbero trovare funziona in molti casi. si prega di segnalare i problemi a DataTable-aiuto o Stack tag data.table di Overflow.

non per l'uso in produzione ancora. Non perché è instabile nel senso che si blocca o è bacato (il test mostrerà se è stabile nei tuoi casi o meno) ma poiché gli argomenti di fread e il comportamento di potrebbero cambiare in futuro; vale a dire, prevediamo di apportare modifiche non retrocompatibili a (auspicabilmente minori). Perché è stato rilasciato in CRAN? Poiché è stato richiesto un rilascio di manutenzione da parte dei manutentori di CRAN per rispondere a nuovi test più rigorosi in R-devel, e un pacchetto su Bioconductor dipende da data.table e Bioconductor richiede che i pacchetti superino i controlli di R-devel.È stato più rapido lasciare il numero e scrivere questi paragrafi, piuttosto che dare un'occhiata.

+9

'fread' è molto bello (ma dovrei essere elogiato davvero su SO?), E onestamente non avevo idea di dove questa roba provenisse (non si è dimostrato al di fuori di knitr) quindi certamente non intendevo turbare i sentimenti di nessuno. Volevo solo scoprire quale fosse la causa, contattare direttamente l'autore del pacchetto pertinente. – baptiste

+9

Hai dovuto essere così duro nella tua risposta? Comprendo le critiche suscitate da qualcosa che hai scritto, ma non so che l'attaccamento al povero ragazzo aiuti qui. L'ho fatto quando qualcuno ha seguito uno dei miei progetti open source e non è mai andato bene. –

+5

per la cronaca, non sto facendo downvoting di questa risposta, ma accettandola. Anch'io ho progetti open source, trascorro ore e ore ad aiutare le persone, sappiamo tutti com'è. – baptiste

11

Non è un problema da segnalare.

Come dichiarato da Matthew Dowle, questo è un contatore di avanzamento da fread

È possibile impostare results = 'hide' per evitare questi risultati essere inclusi

library(knitr) 

test = "```{r, results = 'hide'} 
require(data.table) 
fread('1 2 3\n') 
```" 
knit2html(text=test, output="test.html") 
browseURL("test.html") 

sguardo, senza barra di avanzamento.


A livello pratico, penso che sarebbe opportuno avere results = 'hide' o anche include = FALSE per un passo del genere.

Lei non vuole ripetere questo tipo di lettura in fase, in pratica, è sempre e solo desidera leggere i dati in una sola volta, allora si avrebbe serializzare (usando save, saveRDS o simili), così si potrebbe usare quella successiva tempo (che sarebbe più veloce).


Modifica alla luce del commento

Vorrei dividere la trasformazione in un certo numero di blocchi più piccoli. Non si poteva quindi includere la lettura in pezzo, ma includere una versione fittizia che non è valutato (in modo da poter vedere il codice, ma non include i risultati)

```{r libraries} 
require(data.table) 
``` 

```{r loaddata, include = FALSE} 
DT <- fread('yourfile') 
``` 

```{r loaddummy, ref.label = 'loaddata', eval = FALSE, echo = TRUE} 
``` 

```{r dostuff} 
# doing other stuff 
``` 
+0

grazie, ma dal momento che voglio vedere altri risultati della stessa porzione che mi lascia con la soluzione che ho trovato prima (reindirizzando la linea di fread per affondare). – baptiste

+0

@baptiste. Vorrei dividere il pezzo. Non vuoi leggere ripetutamente il file, quindi fallo come un blocco separato che viene memorizzato nella cache, quindi lo fai solo una volta. – mnel

+0

grazie a @mnel. La domanda era più di scoprire la causa scatenata per segnalarla; Conosco le opzioni in knitr per risolvere il problema, utilizzare la cache, ecc. – baptiste

0

C'è un parametro chiamato showProgress in fread, se lo imposti su FALSE, quindi non vedrai l'output del progresso. (È utile per creare markdown r.)