【问题标题】:R Markdown: Can't access Bash command installed through Conda/AnacondaR Markdown:无法访问通过 Conda/Anaconda 安装的 Bash 命令
【发布时间】:2019-09-26 23:38:50
【问题描述】:

我正在探索一些生物信息学数据,并且我喜欢尽可能使用 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 笔记本/Rmarkdown bash 代码块访问使用 conda/在我的 conda env 中安装的工具?我搜索了很长时间,找不到任何人谈论在 Rmarkdown 的 shell 块中运行 conda 命令。任何帮助将不胜感激,因为我喜欢用于探索性分析的 R 笔记本格式。

【问题讨论】:

    标签: r bash r-markdown conda environment


    【解决方案1】:

    向引擎传递参数

    如果您的 Conda 是 properly configured to work in bash,那么您可以使用 engine.opts 告诉 bash 以登录模式启动(即,获取您的 .bash_profile (Mac) 或 .bashrc (Linux)):

    重击

    ```{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 所在的位置,以便可以从渲染版本中干净地复制输出。

    【讨论】:

    • 我实际上无法使用 zsh。我的块头是:{zsh, engine.opts='-l'}。我遇到了最初遇到的相同错误:/var/folders/dr/tx09yq8n7s9b2mnlyh5lhxvr0000gn/T/RtmpxVYtGE/chunk-code-c6e560c02889.txt:2: command not found: bcftools。我弄清楚如何使用 zsh 的唯一方法是在块的开头添加一个source ~/.zshrc 行,以便它可以在/Users/<USERNAME>/anaconda3/bin/bcftools 中找到bcftools 二进制文件。 zsh 是否有一种等效的方法来自动获取 ~/.zshrc,就像 Bash 对 ~/.bash_profile'-l' 一样?
    • 我通过将引擎选项从登录 ({zsh, engine.opts='-l'}) 切换到交互 ({zsh, engine.opts='-i'}) 来让它工作。可能是由于 Zsh 获取点文件的方式与 Bash 相比存在差异。
    • @Leo 感谢您的留言。我用该信息更新了答案。
    【解决方案2】:

    bash 的快速解决方案:以下初始化脚本添加到您的 Bash 脚本中。

    eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
    
    # you may need to activate the "base" environment explicitly
    conda activate base
    

    详情

    当您打开终端时,会生成一个交互式 shell。但是您的脚本在非交互式外壳中运行。 Bash 配置文件~/.bashrc 不会用于脚本,它会跳过conda 初始化,并且您的“基础”环境不会暴露在PATH 中。

    参考文献

    【讨论】:

    • 我试过这个,但即使尝试访问conda activate 命令来激活我的环境时仍然出现错误:# Test Bash chunk ```{bash} eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)" conda activate binfo bcftools ``` /var/folders/9l/phf62p1s0cxgnzp4hgl7hy8h0000gn/T/Rtmpcy5EuN/chunk-code-80345e779e.txt: line 2: conda: command not found /var/folders/9l/phf62p1s0cxgnzp4hgl7hy8h0000gn/T/Rtmpcy5EuN/chunk-code-80345e779e.txt: line 3: bcftools: command not found
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2015-05-30
    • 2019-02-23
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多