Как скрыть одну конкретную ячейку (ввод или вывод) в IPython Notebook?

Есть ли способ выборочно скрыть одну конкретную ячейку ввода или вывода в ноутбуке IPython?

Я мог только найти приведенный ниже код, чтобы показать/скрыть все ячейки ввода.

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

Но что, если я только хочу скрыть первую ячейку ввода ноутбука?

Ответ 1

Теперь это встроено в nbconvert (с версии 5.3.0) с использованием тегов.

Вот пример удаления конкретной ячейки из вывода. Используя этот ноутбук. В примере есть три ячейки: ячейка разметки, ячейка кода, которая будет скрыта, и ячейка кода, которая не будет скрыта.

  1. Добавьте тег remove_cell в любые ячейки, которые вы хотите скрыть, используя редактор тегов, встроенный в блокнот или JupyterLab (конкретное имя "remove_cell" не имеет значения)
  2. Конвертировать с помощью nbconvert

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

Все ячейки с тегом remove_cell будут удалены из вывода.

hidden

Помимо целых ячеек, вы можете фильтровать только входы или только выходы:

  • TagRemovePreprocessor.remove_input_tags
  • TagRemovePreprocessor.remove_single_output_tags
  • TagRemovePreprocessor.remove_all_outputs_tags

Ответ 2

Это расширение ответа Mathmagician, которое позволяет вам:

  • переключать только одну ячейку (имя функции JS имеет произвольный суффикс, поэтому, если оно используется более одного раза, оно не будет конфликтовать с другими использованиями)
  • переключить ячейку ниже текущей ячейки - это очень удобно в презентациях RISE, где вы можете показать код, но затем скрыть его, чтобы отобразить его вывод

demo of the toggle

Вам нужно сначала запустить следующий код, чтобы определить функцию hide_toggle:

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)

А затем используйте его в таких клетках:

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

hide_toggle()

Или это (если вы хотите переключить следующую ячейку)

hide_toggle(for_next=True)

Ответ 3

Здесь метод, который позволяет скрывать ячейки из вывода HTML/PDF, только редактируя метаданные ячейки.

Версии, которые я использую:

$ jupyter notebook --version

4.1.0

$ jupyter nbconvert --version

4.2.0

  1. Загрузите шаблоны расширения для ipython для ноутбуков, следуя инструкциям по установке на Github: pip install https://github.com/ipython-contrib/IPython-notebook-extensions/tarball/master
  2. запустить jupyter notebook
  3. перейдите на localhost:8888/nbextensions (или любой другой порт, который вы начали) и активируйте Printview
  4. вернуться к localhost:8888/tree, создать новый блокнот и войти в него
  5. создайте ячейку кода с некоторым кодом в ней, который производит выходные данные, например print("You can see me") #but not me
  6. перейдите в меню " View > " Cell Toolbar > " Edit Metadata
  7. нажмите кнопку " Edit Metadata, которая теперь отображается в правом верхнем углу ячейки
  8. add 'hide_input':True для json, например, мой был похож на { "collapsed": false, "hide_input": true, "trusted": true } after
  9. сохранить ноутбук
  10. вернитесь к терминалу и выполните jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb (если ваш ноутбук называется notebookname.ipynb.ipynb)

Теперь у вас должен быть документ под названием notebookname.pdf в каталоге. Надеюсь, у него должен быть только текст. You can see me в нем... пальцы скрещены.

Ответ 4

Ваше решение для скрытия всех входных ячеек может быть изменено, чтобы воздействовать только на одну ячейку.

Измените '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 raw code input, click <a href="javascript:code_toggle()">here</a>.''')

Это работает, потому что, когда вы нажимаете приглашение "click here" на выходе ячейки, эта ячейка становится "выбранной" ячейкой и, таким образом, становится скрытой.

Если ваш код JavaScript выполняет переключение между тегами <script></script> с строкой кода, подобной этому

$( document ).ready(code_toggle);

то блок будет автоматически ("по умолчанию") скрываться при выполнении входной ячейки.

Имейте в виду, что если вы по умолчанию скрываете ячейки, вы должны запустить ячейку с опцией Run Cells (Ctrl + Return), а не с параметрами Run Cells и Select/Insert Below. Они будут вызывать перемещение "выбранной" метки в следующую ячейку перед выполнением JavaScript, поэтому вы можете скрыть ячейку, в которой нет ссылки "нажмите здесь". В этом случае вам придется проверять ячейку и перемещаться по соответствующим тегам и изменять display='none'; для display='block'; ,

Обратите внимание, что это должно быть помещено в конец любого кода в вашей ячейке и что перед выполнением этого кода вам нужно импортировать HTML из IPython.display. Вы можете сделать это, выполнив

from IPython.display import HTML

Ответ 5

Что касается вывода, в записной книжке Jupiter есть также опция на панели: enter image description here Вы можете Clear выводить или скрывать его, используя Toggle. В обоих случаях вы не будете удалять переменные, вычисленные внутри ячейки.

Ответ 6

Если кто-то найдет полезным исключение всех ячеек кода (это не то, о чем здесь просят), вы можете добавить этот флаг nbconvert --TemplateExporter.exclude_code_cell=True

Ответ 7

Хорошо, после попытки безуспешно ответы здесь изложены. Я нашел это расширение кирбов. Hide_code nbextension Работает просто отлично. Но рекомендуется сделать следующее:

Прежде всего, убедитесь, что вы обновили свой jupyter, nbconverter, расширения nbconverter и jupyter serverextension. Если вы сделали это, вы можете сделать следующее в приглашении anaconda (Открыто с правами администратора):

  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

Наконец, если вы используете дистрибутив anaconda, чтобы открыть свои ноутбуки, убедитесь, что вы также используете следующие команды:

  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

Если при выполнении этих команд нет ошибок, вы сможете увидеть и использовать параметры скрытия кода на панели инструментов, как показано здесь:

Панель инструментов Hide_code

Готово! Если вы используете кнопку для экспорта и вуаля!

Кнопка экспорта

Удачи

Ответ 9

Решение @Mathmagician почти идеально, но имеет множество побочных эффектов.

Правильнее было бы:

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))

Вызов toggle_code может быть помещен в некоторую ячейку кода перед другим кодом, поэтому, если код в ячейке выполняется медленно, это не будет побочным эффектом. Также он решает проблему с Run Cells и Select/Insert Below

Он добавляет кнопку переключения, но исходное состояние невозможно управлять