【问题标题】:Can I call custom javascript from an R jupyter notebook我可以从 R jupyter 笔记本调用自定义 javascript
【发布时间】:2016-01-08 21:46:53
【问题描述】:

我有一个使用 R 编程语言的Jupyter Notebook。我想在这个 R 笔记本中打电话给javascript functions

我知道有一种方法可以做到这一点,因为您可以从 R 调用基于 javascript 的库,但我找不到任何包装 javascript 函数的示例,因此 R 可以使用它。

即使是将 javascript 分配给 R variable 然后调用该 R 变量的示例也会有所帮助。

【问题讨论】:

    标签: javascript r jupyter


    【解决方案1】:

    js::js_eval() 可以评估 R 中的 JavaScript 字符串。来自?js::js_eval

    # Stateless evaluation
    js_eval("(function() {return 'foo'})()")
    

    对于更复杂的 JavaScript 操作,请查看V8,它可以让您保留一个 JavaScript 实例超过一行。来自?V8::v8

    # Create a new context
    ctx <- v8();
    
    # Evaluate some code
    ctx$eval("var foo = 123")
    ctx$eval("var bar = 456")
    ctx$eval("foo+bar")
    

    最终,除了小技巧之外的任何事情都会让人非常沮丧,但它确实有效。如果你很聪明,你可能会获取整个脚本,但我不确定它是否值得,除非有一些东西绝对只能在 JavaScript 中完成。快乐的黑客攻击!

    【讨论】:

    • 感谢您的帮助!
    • 如果您尝试此操作并且无法让 js_eval 正常工作,以下对我有用:在终端 sudo gem install libv8 -v '3.16.14.3' -- --with-system-v8 brew tap homebrew/versions brew install v8-315 在 R 中,install.packages("V8") install_github("jeroenooms/js") Javascript 现在可以工作了。 js::js_eval("(function() {return 'foo'})()")
    【解决方案2】:

    我只是想添加这个答案,以防有人对在 Jupyter R 中使用 javascript/html 感兴趣。以下是一个非常基本的示例:

    test="<input type=\"file\" id=\"myFile\"/>"
    as.factor(test)
    

    as.factor() 删除了引号,但您基本上可以将 javascript/html 分配给 r 变量并调用该变量。例如:

    test="<input type=\"file\" id=\"myFile\"/>"
    test
    

    【讨论】:

    • 我想在R中运行这段代码(在python jupyter notebook中工作):%%javascriptvar cell = Jupyter.notebook.get_selected_cell();console.log(Jupyter.notebook.find_cell_index(cell));你有什么建议吗?
    【解决方案3】:

    所以我找到了另一种使用 HTML 函数的方法。这是一个通过单击文本来显示和隐藏单元格中的代码的示例。

    from IPython.core.display import HTML
    HTML("""
     <style>
         // add your CSS styling here
     </style>
     <script>
         var code_show=true; //true -> hide code at first
    
         function code_toggle() {
             $('div.prompt').hide(); // always hide prompt
    
             if (code_show){
                 $('div.input').hide();
             } else {
                 $('div.input').show();
             }
             code_show = !code_show
         }
         $( document ).ready(code_toggle);
     </script>
     <a href="javascript:code_toggle()" 
         style="text-decoration:none; background-color: none;color:black;">
         <h1 align="center">Example</h1>
     </a>
    """)
    

    【讨论】: