How to hide one specific cell (input or output) in IPython Notebook?

后端 未结 10 1473
伪装坚强ぢ
伪装坚强ぢ 2020-11-29 21:53

Is there a way to selectively hide one specific input or output cell in IPython notebook?

I could only find the below code to show / hide all input cells.

h

相关标签:
10条回答
  • 2020-11-29 22:10

    Using that code:

    # @hidden
    from IPython.display import HTML
    HTML('''<script>
    code_show=true; 
    function code_toggle() {
     if (code_show){
     $('.cm-comment:contains(@hidden)').closest('div.input').hide();
     } else {
     $('.cm-comment:contains(@hidden)').closest('div.input').show();
     }
     code_show = !code_show
    } 
    $( document ).ready(code_toggle);
    </script>
    The raw code for this IPython notebook is by default hidden for easier reading.
    To toggle on/off the raw code, click <a href="javascript:code_toggle()">here</a>.''')
    

    Extracted from here and modified by me.

    You can hide lines with comment:

    # @hidden
    
    0 讨论(0)
  • 2020-11-29 22:16

    In case anyone finds excluding all code cells helpful (which is not what is asked here), you can add this flag nbconvert --TemplateExporter.exclude_code_cell=True

    0 讨论(0)
  • 2020-11-29 22:17

    This is now built into nbconvert (as of 5.3.0) using tags.

    Here's an example removing a specific cell from the output. Using this notebook. The example has three cells: a markdown cell, a code cell that will be hidden, and a code cell that will not be hidden.

    1. Add the remove_cell tag to any cells you want to hide using the tag editor built into the notebook or JupyterLab (the specific name "remove_cell" doesn't matter)
    2. Convert with nbconvert

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

    Any cells with the tag remove_cell will be removed from the output.

    In addition to entire cells, you can filter just inputs or just outputs:

    • TagRemovePreprocessor.remove_input_tags
    • TagRemovePreprocessor.remove_single_output_tags
    • TagRemovePreprocessor.remove_all_outputs_tags
    0 讨论(0)
  • 2020-11-29 22:17

    This is an extension of Mathmagician's answer, which enables you to:

    • toggle just a single cell (the JS function name has a random suffix, so if used more than one time, it would not conflict with other usages)
    • toggle the cell below the current cell - this is super handy in RISE presentations where you may want to show the code, but then hide it to display its output

    What you need to do is run the following code first to define the hide_toggle function:

    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)
    

    And then use it in cells like this:

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

    Or this (if you want to toggle the next cell)

    hide_toggle(for_next=True)
    
    0 讨论(0)
  • 2020-11-29 22:17

    Ok, after trying without success the answers here stated. I found this extension of kirbs.Hide_code nbextension It works just fine. But it is recommended to do the following:

    First of all, make sure that you have updated your jupyter, the nbconverter, the nbconverter extensiones and the jupyter serverextension. If you did that then you can do the following in the anaconda prompt (Opened with admin priviledges):

    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

    Finally if you are using anaconda distribution to open your notebooks then make sure of also using these commands:

    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

    If there are no error on the execution of these commands then you will be able to see and use the hide code options in the toolbar as it is shown here:

    Hide_code toolbar

    Done! If you use the button for exporting and voilá!

    Export Button

    Good luck

    0 讨论(0)
  • 2020-11-29 22:18

    Your solution for hiding all input cells can be altered to affect just a single cell.

    Change 'div.input' to '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>.''')
    

    This works because when you click the "click here" prompt on a cell's output, that cell becomes the "selected" cell and thus becomes hidden.

    If your JavaScript code executes a toggle within the <script></script> tags with a line of code like this

    $( document ).ready(code_toggle);
    

    then the block will automatically ("by default") be hidden when the input cell is executed.

    Keep in mind that if you do make cell inputs hidden by default, you must run the cell with the Run Cells (Ctrl+Return) option, not the Run Cells and Select/Insert Below options. These will prompt the move of the "selected" label to the next cell before executing the JavaScript, so you may end up hiding a cell that doesn't have the "click here" toggle link in its output. In which case you will have to inspect the cell and navigate through the relevant tags and change display='none'; to display='block';.

    Note that this must be put at the end of any code in your cell, and that you need to have imported HTML from IPython.display before executing this code. You can do so by executing

    from IPython.display import HTML
    
    0 讨论(0)
提交回复
热议问题