在 R jupyter notebook 中使用 ipython 魔法?
Using ipython magics in R jupyter notebook?
我用 conda install jupyter
安装了 jupyter,并且 运行 正在用 conda create -n my-r-env -c r r-essentials
安装的 r 内核安装笔记本
我正在 运行 笔记本电脑,想从 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 笔记本设置为与 ipython 笔记本在 bash 命令(以及其他魔法)方面具有相同的功能?
只需 bash 命令,就可以使系统命令起作用。例如,在 IRkernel 中:
system("echo 'hi'", intern=TRUE)
输出:
'hi'
或查看文件的前 5 行:
system("head -5 data/train.csv", intern=TRUE)
由于 IPython 魔法在 IPython 内核中可用(但在 IRkernel 中不可用),我快速检查了是否可以使用 rPython
和PythonInR
个图书馆。但是,问题是 get_ipython()
对 Python 代码不可见,因此以下 none 有效:
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')")
通过将调用包装在 cat
中并将 '\n'
指定为分隔符,可以对 system
的输出进行外观改进,这将在单独的行上显示输出而不是由 whitespaces 分隔,这是字符向量的默认设置。这对于像 tree
这样的命令非常有用,因为除非用换行符分隔,否则输出的格式毫无意义。
比较名为 test
的示例目录的以下内容:
Bash
$ tree test
test
├── A1.tif
├── A2.tif
├── A3.tif
├── README
└── src
├── sample.R
└── sample2.R
1 directory, 6 files
Jupyter Notebook 中的 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 中的 space 分隔。
您可以创建一个函数来节省您的输入时间:
> # "jupyter shell" function
> js <- function(shell_command){
> cat(system(shell_command, intern=TRUE), sep='\n')
> }
>
> # brief syntax for shell commands
> js('tree test')
我用 conda install jupyter
安装了 jupyter,并且 运行 正在用 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 笔记本设置为与 ipython 笔记本在 bash 命令(以及其他魔法)方面具有相同的功能?
只需 bash 命令,就可以使系统命令起作用。例如,在 IRkernel 中:
system("echo 'hi'", intern=TRUE)
输出:
'hi'
或查看文件的前 5 行:
system("head -5 data/train.csv", intern=TRUE)
由于 IPython 魔法在 IPython 内核中可用(但在 IRkernel 中不可用),我快速检查了是否可以使用 rPython
和PythonInR
个图书馆。但是,问题是 get_ipython()
对 Python 代码不可见,因此以下 none 有效:
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')")
通过将调用包装在 cat
中并将 '\n'
指定为分隔符,可以对 system
的输出进行外观改进,这将在单独的行上显示输出而不是由 whitespaces 分隔,这是字符向量的默认设置。这对于像 tree
这样的命令非常有用,因为除非用换行符分隔,否则输出的格式毫无意义。
比较名为 test
的示例目录的以下内容:
Bash
$ tree test
test
├── A1.tif
├── A2.tif
├── A3.tif
├── README
└── src
├── sample.R
└── sample2.R
1 directory, 6 files
Jupyter Notebook 中的 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 中的 space 分隔。
您可以创建一个函数来节省您的输入时间:
> # "jupyter shell" function
> js <- function(shell_command){
> cat(system(shell_command, intern=TRUE), sep='\n')
> }
>
> # brief syntax for shell commands
> js('tree test')