comprimi la cella nel taccuino di Giove


143

Sto usando il notebook ipython Jupyter. Diciamo che ho definito una funzione che occupa molto spazio sul mio schermo. C'è un modo per far crollare la cella?

Voglio che la funzione rimanga eseguita e richiamabile, ma voglio nascondere / comprimere la cella per visualizzare meglio il notebook. Come posso fare questo?


30
Wow, è già il 2017 e non esiste una soluzione semplice
user1700890,

31
2019 e ancora contando
Hardian Lawi

23
2020 ... (primo!)
itzy

5
Ah, ti mando un promemoria in modo da poter essere il primo nel 2021
novizio

6
JupyterLab ha questo dal 2019. Evidenzia una cella e fai clic sulla barra blu accanto ad essa. Ora lo vedrai rappresentato come tre punti. Sarà rispettato quando salvi e riapri successivamente o altrove. Ci sono ulteriori funzionalità e opzioni, come View> Collapse All Code, vedi qui e il link qui .
Wayne,

Risposte:


94

Il jupyter contrib nbextensionspacchetto Python contiene un'estensione per la piegatura del codice che può essere abilitata all'interno del notebook. Segui il link (Github) per la documentazione.

Per installare utilizzando la riga di comando:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Per semplificare la vita nella loro gestione, consiglierei anche il jupyter nbextensions configuratorpacchetto. Ciò fornisce una scheda aggiuntiva nell'interfaccia del Notebook da cui puoi facilmente (de) attivare tutte le estensioni installate.

Installazione:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

11
Roba interessante, anche se vorrei che la estensione "Codefolding" piegasse intere celle, e non solo blocchi di codice.
bsmith89,

2
Se qualcuno incontra problemi di installazione con conda prova: pip install jupyter_contrib_nbextensionsallora jupyter contrib nbextensions install --sys-prefix --skip-running-check. Vorrei che Jupyter avesse questo pacchetto di default.
user1700890,

7
Semplice percorso di installazione è via Conda sé : conda install -c conda-forge jupyter_contrib_nbextensions.
Max Ghenis,

3
Solo una breve nota per chiunque usi il più recente JupyterLab. Secondo il sito GitHub menzionato, queste estensioni funzionano in JupyterLab. Me lo sono chiesto anch'io, quindi ho pensato di far sapere agli altri. Citando il repo GitHub: Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
NYCeyes,

2
È possibile comprimere un'intera cella se si inserisce un #commento nella parte superiore della cella. Jupyter fornisce quindi una freccia a discesa che comprime l'intera cella.
EatSleepCode

29

JupyterLab supporta il collasso cellulare. Facendo clic sulla barra blu della cella a sinistra piegherà la cella. inserisci qui la descrizione dell'immagine


6
non persiste nell'esportazione
cosmosa

C'è una buona soluzione per questo? Voglio davvero tanto nascondere le celle compresse durante l'esportazione. Voglio mantenere un po 'di codice e un po' di output, e nascondere qualche altro codice e output, quindi non posso semplicemente nascondere tutto il codice .....
Russell Richie,

2
Il codice e l'output possono essere compressi come descritto in questa risposta. Inoltre, l'informazione è persistente. È scritto nei metadati della cella. source_hiddened outputs_hiddenè impostato. nbformat.readthedocs.io/it/latest/…
gillesB

27

Puoi creare una cella e inserire il seguente codice:

%%html
<style>
div.input {
    display:none;
}
</style>

L'esecuzione di questa cella nasconderà tutte le celle di input. Per mostrarli indietro, è possibile utilizzare il menu per cancellare tutte le uscite.

Altrimenti puoi provare le estensioni per notebook come di seguito:

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Home_3x


Le estensioni per notebook sono davvero buone. Ci sono anche molte altre cose. github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha,

16

Ho avuto un problema simile e le "nbextensions" segnalate da @Energya hanno funzionato molto bene e senza sforzo. Le istruzioni di installazione sono semplici (ho provato con anaconda su Windows) per le estensioni del notebook e per il loro configuratore .

Detto questo, vorrei aggiungere che le seguenti estensioni dovrebbero essere interessanti.

  • Nascondi input | Questa estensione consente di nascondere una singola codecell in un notebook. Ciò può essere ottenuto facendo clic sul pulsante della barra degli strumenti: Nascondi input

  • Intestazioni pieghevoli | Consente al notebook di avere sezioni comprimibili, separate da titoli Titoli pieghevoli

  • Codefolding | Questo è stato menzionato ma lo aggiungo per completezza code folding


9

Crea il file custom.js all'interno di ~ / .jupyter / custom / con i seguenti contenuti:

$("<style type='text/css'> .cell.code_cell.collapse { max-height:30px; overflow:hidden;} </style>").appendTo("head");
$('.prompt.input_prompt').on('click', function(event) {
    console.log("CLICKED", arguments)   
    var c = $(event.target.closest('.cell.code_cell'))
    if(c.hasClass('collapse')) {
        c.removeClass('collapse');
    } else {
        c.addClass('collapse');
    }
});

Dopo aver salvato, riavvia il server e aggiorna il notebook. Puoi comprimere qualsiasi cella facendo clic sull'etichetta di input (In []).


3
Questo non ha funzionato per me poiché il div da modificare non viene caricato, quando viene eseguito il js personalizzato. Tuttavia, questo può essere risolto avvolgendo tutto in setTimeout (function () {...}, 3000);
Steohan,

2
Questo ha funzionato per me dopo aver cambiato la quarta riga in: var c = $(event.target).closest('.cell.code_cell') e seguendo il suggerimento di Steohan di avvolgere tutto in setTimeout.
proteoma,

Puoi semplicemente usare c.toggleClass ('collapse'); invece dell'istruzione if-else.
gouravkr,

9

L'estensione hide_code ti consente di nascondere singole celle e / o i prompt accanto ad esse. Installa come

pip3 install hide_code

Visita https://github.com/kirbs-/hide_code/ per maggiori informazioni su questa estensione.


9

Innanzitutto, segui le istruzioni di Energya:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

La seconda è la chiave: dopo aver aperto il taccuino di Giove, fare clic sulla scheda Nbextension. Ora cerca "colla" dallo strumento di ricerca fornito da Nbextension (non dal browser web) , quindi troverai qualcosa chiamato "Titoli comprimibili"

Questo è quello che vuoi!


2

Come altri hanno già detto, puoi farlo tramite nbextensions. Volevo dare una breve spiegazione di ciò che ho fatto, che è stato semplice e veloce:

Per abilitare le intestazioni comprimibili: Nel terminale, abilitare / installare le estensioni per notebook Jupyter inserendo prima:

pip install jupyter_contrib_nbextensions

Quindi, inserisci:

jupyter contrib nbextension install

Riapri Jupyter Notebook. Vai alla scheda "Modifica" e seleziona "Configura estensione". Deseleziona la casella direttamente sotto il titolo "Nbextensioni configurabili", quindi seleziona "intestazioni comprimibili".


Chiedendosi perché non si può accedere nbextensions configdirettamente dalla dashboard principale e si deve invece aprire un notebook. In alternativa, come altri hanno già detto, si può accedervi tramite localhost:8888/nbextensions(o qualunque porta sia nella propria configurazione)
Antoine

2

Ci sono molte risposte a questa domanda, che ritengo non siano soddisfacenti (alcune più di altre), delle molte estensioni - piegare il codice, piegare per titoli ecc. Ecc. Nessuna fa quello che voglio in modo semplice ed efficace. Sono letteralmente stupito che non sia stata implementata una soluzione (come per Jupyter Lab).

In effetti, ero così insoddisfatto che ho sviluppato un'estensione per notebook molto semplice che può espandere / comprimere il codice in una cella di notebook, mantenendolo eseguibile.

Il repository GitHub: https://github.com/BenedictWilkinsAI/cellfolding

Di seguito è una piccola demo di ciò che l'estensione fa:

Basta fare doppio clic a sinistra della cella del codice per comprimerlo su una sola riga:

Fare di nuovo doppio clic per espandere la cella.

L'estensione può essere installata facilmente con pip:

pip install nbextension-cellfolding
jupyter nbextension install --py cellfolding --user
jupyter nbextension enable --py cellfolding --user 

ed è anche compatibile con il configuratore di nbextension . Spero che le persone lo trovino utile!


2
Ha funzionato come un fascino. Neat
Ayan Mitra

1

C'è anche una versione migliorata del suggerimento di Pan Yan. Aggiunge il pulsante che mostra indietro le celle di codice:

%%html
<style id=hide>div.input{display:none;}</style>
<button type="button" 
onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">
Show inputs</button>

O pitone:

# Run me to hide code cells

from IPython.core.display import display, HTML
display(HTML(r"""<style id=hide>div.input{display:none;}</style><button type="button"onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">Show inputs</button>"""))

2
I codici nascondono TUTTA la cella di input, non una cella particolare.
Jack Fleeting,

Proprio quello che volevo per l'output, ma puoi comprimere / nascondere tutto l'output attivandolo nel menu Jupyter: Cella> Tutti gli output> Attiva / disattiva
marcatura

Peccato, questa è l'unica soluzione che ho trovato che nasconde il codice per impostazione predefinita e lo mostra solo al clic. Sfortunatamente, questo nasconde tutte le cellule e non solo un bersaglio.
penelope,

@penelope puoi verificare se celle diverse hanno ID di elementi html diversi o classi univoche. Se sì, puoi modificare la mia risposta di conseguenza. La mia risposta ha effetto su tutte le cellule perché non distingue tra celle.
Peter Zagubisalo,

1

Non è necessario fare molto se non per abilitare le estensioni:

http://localhost:8888/nbextensions?nbextension=collapsible_headings
http://localhost:8888/nbextensions?nbextension=codefolding/main

inserisci qui la descrizione dell'immagine

Molto probabilmente troverai tutte le tue estensioni qui:

http://localhost:8888/nbextensions

inserisci qui la descrizione dell'immagine


1

Quello che uso per ottenere il risultato desiderato è:

  1. Salvare il blocco di codice seguente in un file denominato toggle_cell.pynella stessa directory del notebook
from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Sloution"></form>
'''

toggle_code_prepare_str = '''
    <script>
    function code_toggle() {
        if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
            $('div.cell.code_cell.rendered.selected div.input').hide();
        } else {
            $('div.cell.code_cell.rendered.selected div.input').show();
        }
    }
    </script>

'''

display(HTML(toggle_code_prepare_str + toggle_code_str))

def hide_sloution():
    display(HTML(toggle_code_str))
  1. Aggiungi quanto segue nella prima cella del tuo notebook
from toggle_cell import toggle_code as hide_sloution
  1. Qualsiasi cella è necessario aggiungere il pulsante di attivazione / disattivazione per chiamare semplicemente hide_sloution()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.