17

我安装了 jupyter,conda install jupyter并且正在运行一个安装了 r 内核的笔记本conda create -n my-r-env -c r r-essentials

我正在运行笔记本并想从 shell 运行 bash 命令。

!echo "hi"
Error in parse(text = x, srcfile = src): <text>:1:7: unexpected string constant
1: !echo "hi"

为了比较,在带有 python 内核的笔记本中:

!echo "hi"
hi

有没有办法将 R 笔记本设置为在 bash 命令(可能还有其他魔法)方面具有与 ipython 笔记本相同的功能?

4

2 回答 2

14

对于 bash 命令,可以使系统命令正常工作。例如,在 IRkernel 中:

system("echo 'hi'", intern=TRUE)

输出:

'hi'

或者查看文件的前 5 行:

system("head -5 data/train.csv", intern=TRUE)

由于 IPython 内核(但不在 IRkernel 中)中提供了 IPython 魔法,因此我快速检查了是否可以使用rPythonPythonInR库访问这些魔法。但是,问题在于get_ipython()Python 代码不可见,因此以下方法均无效:

library("rPython")
rPython::python.exec("from IPython import get_ipython; get_ipython().run_cell_magic('writefile', 'test.txt', 'This is a test')")

library("PythonInR")
PythonInR::pyExec("from IPython import get_ipython; get_ipython().run_cell_magic('head -5 data/test.csv')")
于 2016-04-19T08:23:58.123 回答
5

system可以通过将调用包装cat并指定为分隔符来获得对输出的外观改进'\n',它将输出显示在单独的行上,而不是由字符向量的默认值分隔的空格。这对于像这样的命令非常有用tree,因为除非用换行符分隔,否则输出的格式几乎没有意义。

比较名为 的示例目录的以下内容test

重击

$ tree test
test
├── A1.tif
├── A2.tif
├── A3.tif
├── README
└── src
    ├── sample.R
    └── sample2.R

1 directory, 6 files

Jupyter 笔记本中的 R

system只是,难以理解的输出:

> system('tree test', intern=TRUE)

'test' '├── A1.tif' '├── A2.tif' '├── A3.tif' '├── README' '└── src' '    ├── sample.R' '    └── sample2.R' '' '1 directory, 6 files

cat+ system,输出看起来像 bash:

> cat(system('tree test', intern=TRUE), sep='\n')

test
├── A1.tif
├── A2.tif
├── A3.tif
├── README
└── src
    ├── sample.R
    └── sample2.R

1 directory, 6 files

请注意,对于类似的命令ls,上面会引入一个换行符,其中输出通常由 bash 中的空格分隔。

您可以创建一个函数来节省一些输入:

> # "jupyter shell" function
> js <- function(shell_command){
>     cat(system(shell_command, intern=TRUE), sep='\n')
> }
>
> # brief syntax for shell commands
> js('tree test')
于 2018-05-09T17:44:45.123 回答