web-dev-qa-db-fra.com

Comment masquer une cellule spécifique (entrée ou sortie) dans IPython Notebook?

Existe-t-il un moyen de masquer sélectivement une cellule d'entrée ou de sortie spécifique dans le bloc-notes IPython?

Je n'ai pu trouver que le code ci-dessous pour afficher/masquer toutes les cellules d'entrée.

http://blog.nextgenetics.net/?e=102

Mais que se passe-t-il si je souhaite uniquement masquer la première cellule d'entrée d'un ordinateur portable?

31
Pan Yan

Ceci est maintenant intégré à nbconvert ( à partir de 5.3. ) à l'aide de balises.

Voici un exemple de suppression d'une cellule spécifique de la sortie. Utilisation de ce carnet . L'exemple comporte trois cellules: une cellule de démarque, une cellule de code qui sera masquée et une cellule de code qui ne sera pas masquée.

  1. Ajouter le remove_cell balise à toutes les cellules que vous souhaitez masquer à l'aide de l'éditeur de balises intégré au bloc-notes ou à JupyterLab (le nom spécifique "remove_cell" n'a pas d'importance)
  2. Convertir avec nbconvert

    jupyter nbconvert nbconvert-example.ipynb --TagRemovePreprocessor.remove_cell_tags='{"remove_cell"}'

Toutes les cellules avec la balise remove_cell sera supprimé de la sortie.

hidden

En plus de cellules entières, vous pouvez filtrer uniquement les entrées ou uniquement les sorties:

  • TagRemovePreprocessor.remove_input_tags
  • TagRemovePreprocessor.remove_single_output_tags
  • TagRemovePreprocessor.remove_all_outputs_tags
33
TomAugspurger

Il s'agit d'une extension de la réponse de Mathmagician, qui vous permet de:

  • basculer juste une cellule unique (le nom de la fonction JS a un suffixe aléatoire, donc s'il est utilisé plusieurs fois, il ne serait pas en conflit avec d'autres utilisations)
  • basculer la cellule en dessous la cellule actuelle - c'est super pratique dans les présentations RISE où vous voudrez peut-être afficher le code, puis le masquer pour afficher sa sortie

demo of the toggle

Ce que vous devez faire est d'exécuter d'abord le code suivant pour définir le hide_toggle une fonction:

from IPython.display import HTML
import random

def hide_toggle(for_next=False):
    this_cell = """$('div.cell.code_cell.rendered.selected')"""
    next_cell = this_cell + '.next()'

    toggle_text = 'Toggle show/hide'  # text shown on toggle link
    target_cell = this_cell  # target cell to control with toggle
    js_hide_current = ''  # bit of JS to permanently hide code in current cell (only when toggling next cell)

    if for_next:
        target_cell = next_cell
        toggle_text += ' next cell'
        js_hide_current = this_cell + '.find("div.input").hide();'

    js_f_name = 'code_toggle_{}'.format(str(random.randint(1,2**64)))

    html = """
        <script>
            function {f_name}() {{
                {cell_selector}.find('div.input').toggle();
            }}

            {js_hide_current}
        </script>

        <a href="javascript:{f_name}()">{toggle_text}</a>
    """.format(
        f_name=js_f_name,
        cell_selector=target_cell,
        js_hide_current=js_hide_current, 
        toggle_text=toggle_text
    )

    return HTML(html)

Et puis utilisez-le dans des cellules comme celle-ci:

x = 1
y = 2
print('Result is {} + {}'.format(x, y))

hide_toggle()

Ou ceci (si vous voulez basculer la cellule suivante)

hide_toggle(for_next=True)
12
Ferrard

Voici une méthode qui vous permet de masquer les cellules de la sortie HTML/PDF en modifiant uniquement les métadonnées de cellule.

Versions que j'utilise:

$ jupyter notebook --version

4.1.0

$ jupyter nbconvert --version

4.2.0

  1. Téléchargez les modèles d'extension de bloc-notes ipython en suivant les instructions d'installation sur Github: pip install https://github.com/ipython-contrib/IPython-notebook-extensions/tarball/master
  2. exécutez jupyter notebook
  3. allez dans localhost:8888/nbextensions (ou sur le port sur lequel vous avez démarré) et activez Printview
  4. retournez à localhost:8888/tree, créez un nouveau cahier et allez-y
  5. créer une cellule de code avec du code qui produit une sortie, par exemple print("You can see me") #but not me
  6. allez dans View> Cell Toolbar> Edit Metadata
  7. cliquez sur le bouton Edit Metadata maintenant affiché en haut à droite de la cellule
  8. ajoutez 'hide_input':True au json, par exemple le mien ressemblait à { "collapsed": false, "hide_input": true, "trusted": true } après
  9. enregistrer le carnet
  10. retournez au terminal et exécutez jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb (si votre ordinateur portable s'appelle notebookname.ipynb.ipynb)

Vous devriez maintenant avoir un document appelé notebookname.pdf dans le répertoire. Espérons qu'il contienne juste le texte You can see me ... les doigts croisés.

11
James Owers

Votre solution pour masquer toutes les cellules d'entrée peut être modifiée pour n'affecter qu'une seule cellule.

Changement 'div.input' à 'div.cell.code_cell.rendered.selected div.input'.

HTML('''<script>
code_show=true; 
function code_toggle() {
    if (code_show){
        $('div.cell.code_cell.rendered.selected div.input').hide();
    } else {
        $('div.cell.code_cell.rendered.selected div.input').show();
    }
    code_show = !code_show
} 

$( document ).ready(code_toggle);
</script>

To show/hide this cell's raw code input, click <a href="javascript:code_toggle()">here</a>.''')

Cela fonctionne parce que lorsque vous cliquez sur le " cliquez ici " Invite sur la sortie d'une cellule, cette cellule devient la cellule "sélectionnée" et devient ainsi masquée.

Si votre code JavaScript exécute une bascule dans le <script></script> balises avec une ligne de code comme celle-ci

$( document ).ready(code_toggle);

alors le bloc sera automatiquement ("par défaut") caché lors de l'exécution de la cellule d'entrée.

Gardez à l'esprit que si vous ne masquez pas les entrées de cellule par défaut, vous devez exécuter la cellule avec Exécuter les cellules (Ctrl+Return), not the Run Cells and Select/Insert Below options. Ceux-ci inciteront le déplacement de l'étiquette "sélectionnée" vers la cellule suivante avant d'exécuter le JavaScript, vous pouvez donc finir par masquer une cellule qui n'a pas le " cliquez ici "bascule le lien dans sa sortie. Dans ce cas, vous devrez inspecter la cellule et parcourir les balises pertinentes et modifier display='none'; à display='block';.

Notez que cela doit être placé à la fin de tout code dans votre cellule et que vous devez avoir importé du HTML depuis IPython.display avant d'exécuter ce code. Vous pouvez le faire en exécutant

from IPython.display import HTML
7
Mathmagician

Si quelqu'un trouve que l'exclusion de toutes les cellules de code est utile (ce qui n'est pas demandé ici), vous pouvez ajouter ce drapeau nbconvert --TemplateExporter.exclude_code_cell=True

4
shouldsee

Concernant la sortie, dans le carnet Jupiter, il y a aussi une option sur la barre: enter image description here Vous pouvez Clear la sortie ou vous pouvez la masquer en utilisant Toggle. Dans les deux cas, vous ne supprimerez aucune variable calculée à l'intérieur de la cellule.

4
G M

D'accord, après avoir essayé sans succès, les réponses ici énoncées. J'ai trouvé cette extension de kirbs . Hide_code nbextension Cela fonctionne très bien. Mais il est recommandé de procéder comme suit:

Tout d'abord, assurez-vous d'avoir mis à jour votre jupyter, le nbconverter, les extensions nbconverter et la serverextension jupyter. Si vous l'avez fait, vous pouvez effectuer les opérations suivantes dans l'invite anaconda (ouvert avec les privilèges d'administrateur):

  1. pip install hide_code
  2. jupyter nbextension install --py hide_code
  3. jupyter nbextension enable --py hide_code
  4. jupyter serverextension enable --py hide_code

Enfin, si vous utilisez la distribution anaconda pour ouvrir vos blocs-notes, assurez-vous également d'utiliser ces commandes:

  1. jupyter nbextension install --sys-prefix --py hide_code
  2. jupyter nbextension enable --sys-prefix --py hide_code
  3. jupyter serverextension enable --sys-prefix --py hide_code

S'il n'y a pas d'erreur sur l'exécution de ces commandes, vous pourrez voir et utiliser les options de masquage de code dans la barre d'outils comme indiqué ici:

barre d'outils Hide_code

Terminé! Si vous utilisez le bouton pour exporter et voilá!

Bouton d'exportation

Bonne chance

3
F4laF

La solution @Mathmagician est presque parfaite, mais a de nombreux effets secondaires.

Plus correct serait comme:

from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Toggle Code"></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 toggle_code():
    display(HTML(toggle_code_str))

L'appel toggle_code que ce qui peut être placé dans une cellule de code avant un autre code, donc si le code dans la cellule est exécuté lentement, il n'y aura pas d'effets secondaires. Il résout également le problème avec Exécuter les cellules et sélectionner/insérer ci-dessous

Il ajoute le bouton bascule, mais l'état initial ne peut pas être géré

1
1
Pan Yan