Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

It only works on a brand new notebook #17

Closed
GZR5876 opened this issue Oct 9, 2020 · 7 comments
Closed

It only works on a brand new notebook #17

GZR5876 opened this issue Oct 9, 2020 · 7 comments

Comments

@GZR5876
Copy link

GZR5876 commented Oct 9, 2020

When I test following codes on a new created jupyternote book, it works. however, once the note book is saved and reopen again, it no longer works. (the df table not shown, only the column headers are displayed).

Tried clear browser cache, restart kernal, restart pc, cant solve the problem. Any one has any idea on this?

Test code:
import itables.interactive
import world_bank_data as wb

df = wb.get_countries()
df

@neon-ninja
Copy link

this sounds a bit like #6

@mwouts
Copy link
Owner

mwouts commented Nov 4, 2020

Thanks @GZR5876 for reporting this. Yes I agree, this sounds like #6. I think this is because the inclusion of the javascript code in the notebook is done very simply, possibly too simply... at least it works with nbconvert, which was not the case of widgets when I gave the first try at this projet.

Anyway, if we want to make some progress on this, maybe we should find what the javascript error is? Does your browser shows anything that could help us?

@mwouts
Copy link
Owner

mwouts commented Nov 15, 2020

Hi @neon-ninja , @GZR5876 , I think I understood the issue.

When the user imports itables, often in the first cell, an invisible output is displayed, which loads the datatables.net library.
If the user either

  • reloads the notebook (without having saved that cell)
  • or reexecutes that cell

then that invisible output is not there any more, and the calls to datatables.net fail.

I can think of two workarounds

  1. execute this
from itables.javascript import load_datatables
load_datatables()

as the first cell. Save the notebook, and then reload it (I can't explain why we need to reload)

  1. stop the kernel and clear the outputs, save the notebook, reload the notebook, and then run the notebook

Obviously we should think of a better approach. At the moment (itables version 0.2.2) I'd probably recommend loading the JS library explicitly at the top of the notebook

from itables.javascript import load_datatables
load_datatables()

I am also having a look at how Plotly do this in the context of a Jupyter Notebook. Apparently the load of the Plotly JS library is associated to the first plot. So, if you have a notebook made of two cells:

import plotly.graph_objects as go

and

go.Figure(data=[go.Bar(y=[1,3,2])])

then

  1. if you execute the notebook, save and reload, the graph is still there
  2. if you execute the cell 2 a second time, then
    a) the graph is still there, until you save and reload
    b) when you save and reload, you need to restart the kernel and run the cell again to get the plot displayed.

So to summarize,

  • the issue in itables is very visible and too easy to trigger because the loading of the JS library is done by import itables, and the user does not expect that cell to have an important output
  • associating the loading of the JS library to the display of the table would make it more similar to how it is done in Plotly. It is a better approach, but it does not solve all the problems
  • so maybe we should mention that in the documentation and also offer a way to explicitly load the JS library like above when we called directly load_datatables()

@mwouts
Copy link
Owner

mwouts commented Dec 22, 2020

This should be fixed now in itables>=0.3.0. Please note that the initialization now works a bit differently - to display all the tables interactively, you should start your notebook with

from itables import init_notebook_mode
init_notebook_mode(all_interactive=True)

@mwouts mwouts closed this as completed Dec 22, 2020
@mattwatkinscs
Copy link

I appear to be having the exact same issue, this originally worked, but having restarted the kernel, the outputs are all blank. I'm using itables==0.3.0 and JupyterHub. I have the following 3 blocks in a fresh notebook and it works fine, yet in an existing notebook even after a kernel restart, there is no output as described above.

from itables import init_notebook_mode
init_notebook_mode(all_interactive=True)

iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')

iris

Existing notebook with no output even after restart:
Screenshot 2021-05-14 at 11 03 56

Fresh notebook seems to work OK:
Screenshot 2021-05-14 at 11 00 24

@mwouts
Copy link
Owner

mwouts commented May 19, 2021

Hi @mattwatkinscs , thank you for your input. May I ask what is the outcome if a) you restart the kernel and b) you reload the notebook (Ctrl+R)? Thanks!

@caleblutru
Copy link

Hi @mattwatkinscs , thank you for your input. May I ask what is the outcome if a) you restart the kernel and b) you reload the notebook (Ctrl+R)? Thanks!

I have the exact same issue. For me it is both a and b. It only works again if I shut down the kernel, close the tab for the notebook and reopen the notebook again in a new tab.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants