R Markdown:无法访问通过 Conda/Anaconda 安装的 Bash 命令
R Markdown: Can't access Bash command installed through Conda/Anaconda
我正在探索一些生物信息学数据,我喜欢尽可能使用 R 笔记本(即 Rmarkdown)。现在,我需要使用命令行工具来分析 VCF 文件,我想通过 Rmarkdown 笔记本中的 Bash 代码块来完成。
问题是我要使用的命令是通过 conda
安装到我的 conda 环境中的。该工具是 bcftools
。当我尝试访问此命令时,出现此错误(代码块被注释掉以显示 rmarkdown 代码块格式):
#```{bash}
bcftools view -H test.vcf.gz
#```
/var/folders/9l/phf62p1s0cxgnzp4hgl7hy8h0000gn/T/RtmplzEvEh/chunk-code-6869322acde0.txt: line 3: bcftools: command not found
而如果我从终端 运行,我得到输出(使用名为 "binfo" 的 conda 环境):
> bcftools view -H test.vcf.gz | head -n 3
chr10 78484538 . A C . PASS DP=57;SOMATIC;SS=2;SSC=16;GPV=1;SPV=0.024109 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:34:33:0:0%:0,33,0,0 0/1:.:23:19:4:17.39%:1,18,0,4
chr12 4333138 . G T . PASS DP=119;SOMATIC;SS=2;SSC=14;GPV=1;SPV=0.034921 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:72:71:1:1.39%:71,0,1,0 0/1:.:47:42:5:10.64%:42,0,5,0
chr15 75086860 . C T . PASS DP=28;SOMATIC;SS=2;SSC=18;GPV=1;SPV=0.013095 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:15:15:0:0%:4,11,0,0 0/1:.:13:8:5:38.46%:5,3,1,4
(binfo)
那么,如何从 R notebook/Rmarkdown bash 代码块访问随 conda/in 我的 conda env 安装的工具?我搜索了很长时间,但找不到任何人在 Rmarkdown 的 shell 块中谈论 运行ning conda
命令。任何帮助将不胜感激,因为我喜欢用于探索性分析的 R 笔记本格式。
bash
的快速解决方案:将以下初始化脚本添加到 Bash 脚本中。
eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
# you may need to activate the "base" environment explicitly
conda activate base
详情
当您打开终端时,会生成一个交互式 shell。但是你的脚本是 运行 中的非交互式 shell。 Bash 配置文件 ~/.bashrc
将不会用于脚本,它会跳过 conda
初始化并且您的 "base" 环境不会暴露到 PATH
.
参考资料
向引擎传递参数
如果您的 Conda 是 properly configured to work in bash,那么您可以使用 engine.opts
告诉 bash 以登录模式启动(即,获取您的 .bash_profile
(Mac) 或 .bashrc
(Linux)):
bash
```{bash engine.opts='-l'}
bcftools view -H test.vcf.gz
```
zsh
如果使用 zsh
(例如,Mac OS 10.15 Catalina 用户),那么交互式标志 --interactive|-i
就是您想要的(来源:@Leo)。
```{zsh engine.opts='-i'}
bcftools view -H test.vcf.gz
```
同样,这假定您之前已经 运行 conda init zsh
将 Conda 设置为与 shell.
一起使用
重现性注意事项
由于可重复性通常是科学工作中的一个关注点,我将补充一点,您可能想要做一些事情来捕获您的 Conda 环境的状态。例如,如果您在版本控制中工作,则提交 conda env export > environment.yaml
。另一种选择是直接在 Rmd 的末尾输出该信息,就像通常使用 sessionInfo()
所做的一样。也就是说,
```{bash engine.opts='-l', comment=NA}
conda env export
```
其中 comment=NA
是为了可以从渲染版本中干净地复制输出。
我正在探索一些生物信息学数据,我喜欢尽可能使用 R 笔记本(即 Rmarkdown)。现在,我需要使用命令行工具来分析 VCF 文件,我想通过 Rmarkdown 笔记本中的 Bash 代码块来完成。
问题是我要使用的命令是通过 conda
安装到我的 conda 环境中的。该工具是 bcftools
。当我尝试访问此命令时,出现此错误(代码块被注释掉以显示 rmarkdown 代码块格式):
#```{bash}
bcftools view -H test.vcf.gz
#```
/var/folders/9l/phf62p1s0cxgnzp4hgl7hy8h0000gn/T/RtmplzEvEh/chunk-code-6869322acde0.txt: line 3: bcftools: command not found
而如果我从终端 运行,我得到输出(使用名为 "binfo" 的 conda 环境):
> bcftools view -H test.vcf.gz | head -n 3
chr10 78484538 . A C . PASS DP=57;SOMATIC;SS=2;SSC=16;GPV=1;SPV=0.024109 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:34:33:0:0%:0,33,0,0 0/1:.:23:19:4:17.39%:1,18,0,4
chr12 4333138 . G T . PASS DP=119;SOMATIC;SS=2;SSC=14;GPV=1;SPV=0.034921 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:72:71:1:1.39%:71,0,1,0 0/1:.:47:42:5:10.64%:42,0,5,0
chr15 75086860 . C T . PASS DP=28;SOMATIC;SS=2;SSC=18;GPV=1;SPV=0.013095 GT:GQ:DP:RD:AD:FREQ:DP4 0/0:.:15:15:0:0%:4,11,0,0 0/1:.:13:8:5:38.46%:5,3,1,4
(binfo)
那么,如何从 R notebook/Rmarkdown bash 代码块访问随 conda/in 我的 conda env 安装的工具?我搜索了很长时间,但找不到任何人在 Rmarkdown 的 shell 块中谈论 运行ning conda
命令。任何帮助将不胜感激,因为我喜欢用于探索性分析的 R 笔记本格式。
bash
的快速解决方案:将以下初始化脚本添加到 Bash 脚本中。
eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
# you may need to activate the "base" environment explicitly
conda activate base
详情
当您打开终端时,会生成一个交互式 shell。但是你的脚本是 运行 中的非交互式 shell。 Bash 配置文件 ~/.bashrc
将不会用于脚本,它会跳过 conda
初始化并且您的 "base" 环境不会暴露到 PATH
.
参考资料
向引擎传递参数
如果您的 Conda 是 properly configured to work in bash,那么您可以使用 engine.opts
告诉 bash 以登录模式启动(即,获取您的 .bash_profile
(Mac) 或 .bashrc
(Linux)):
bash
```{bash engine.opts='-l'}
bcftools view -H test.vcf.gz
```
zsh
如果使用 zsh
(例如,Mac OS 10.15 Catalina 用户),那么交互式标志 --interactive|-i
就是您想要的(来源:@Leo)。
```{zsh engine.opts='-i'}
bcftools view -H test.vcf.gz
```
同样,这假定您之前已经 运行 conda init zsh
将 Conda 设置为与 shell.
重现性注意事项
由于可重复性通常是科学工作中的一个关注点,我将补充一点,您可能想要做一些事情来捕获您的 Conda 环境的状态。例如,如果您在版本控制中工作,则提交 conda env export > environment.yaml
。另一种选择是直接在 Rmd 的末尾输出该信息,就像通常使用 sessionInfo()
所做的一样。也就是说,
```{bash engine.opts='-l', comment=NA}
conda env export
```
其中 comment=NA
是为了可以从渲染版本中干净地复制输出。