运行 R 内核时如何在 google Colab 中访问 shell
Posted
技术标签:
【中文标题】运行 R 内核时如何在 google Colab 中访问 shell【英文标题】:How to access the shell in google Colab when running the R kernel 【发布时间】:2021-12-29 15:44:48 【问题描述】:当我将 Python 与 colab 一起使用时,您可以使用 !
和 %%shell
之类的东西访问底层操作系统,例如 !ls
以列出文件。
当我将 colab 与 R 内核一起使用时,!
和 %%shell
技巧不起作用。在这种情况下,有没有办法从 colab 调用 shell?
https://colab.research.google.com/#create=true&language=r
【问题讨论】:
不确定您是否对解决方法感兴趣,但您可以改用system2("ls", stdout = TRUE)
(或list.files()
)。
好主意,如果没有更短的方法,这可能是最好的选择。至于list.files()
之类的东西,这正是我一直在做的事情(例如,download.file(...)
而不是wget
等)。
【参考方案1】:
有一个基本的 R 函数system
,它允许你调用 Notebook 后面的 shell。由于 colab 抑制了标准输出,因此需要设置选项 intern = TRUE
以将结果视为 R 字符向量。为了正确显示换行符,我定义了一个名为 shell_call
的函数,它类似于 ipython 中的 !
:
shell_call <- function(command, ...)
result <- system(command, intern = TRUE, ...)
cat(paste0(result, collapse = "\n"))
shell_call("ls -lah / | head")
【讨论】:
这基本上是我在评论中已经建议的(除了使用system
- 请参阅?system
:This interface has become rather complicated over the years: see system2 for a more portable and flexible interface which is recommended for new code.
)。
Ipythons !
的行为更多的是函数system
而不是system2
:你不能只写system2("ls -lah /", stdout = TRUE)
。此外,它返回一个字符向量而不是格式化文本。这就是我定义函数!
的原因
当然——我们可以用类似的方式为 system2
编写一个包装器,但我个人不想覆盖 R 中的逻辑运算符 !
。
我将答案修改为不超载!
【参考方案2】:
如here 所述,魔法的实现是内核特定的:
致 Jupyter 用户:魔术是 IPython 特有的并由 IPython 提供 核心。 Magics 是否在内核上可用是一个决定 由内核开发人员基于每个内核制作。要正常工作, Magics 必须使用在底层中无效的语法元素 语言。例如,IPython 内核使用 % 语法元素 对于 Magics,因为 % 在 Python 中不是有效的一元运算符。然而, % 在其他语言中可能有含义。
R 不提供以这种方式实现魔法的良好条件,例如 %%
用作模运算符,!
用作逻辑非运算符。
这就是 IRkernel 的开发人员选择不支持 %%cell 魔术的原因 - 请参阅 this 或 this。
正如 cmets 中已经概述的那样,在使用 IRkernel 时,您需要在 R 语言本身中找到解决方案,例如使用内置函数访问 shell system2("ls", stdout = TRUE)
或搜索文件 list.files()
(您可能还希望按照 @danlooo 的建议将它们包装在自定义函数中)。
如果您仍想使用魔法,另一种方法是使用 R 魔法(扩展 rmagic)和 IPython 内核,如 here 或 here 所示:
【讨论】:
以上是关于运行 R 内核时如何在 google Colab 中访问 shell的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google colab 中更改 Keras/tensorflow 版本?
如何在 colab 中使用 R 运行时更改 tensorflow 版本?
如何在 Google Colab 笔记本的“.py”文件中运行 Python 脚本?