gpt4 book ai didi

r - 为什么在 Mac 和 Linux 上通过 `R -e ..` 的字符串命令需要额外的转义?

转载 作者:IT王子 更新时间:2023-10-29 00:54:26 24 4
gpt4 key购买 nike

这个难倒我了。我执行了一个简单的 shell 脚本,它在我的 Linux(AWS 又名 CentOS)机器上运行良好,但在我的 Mac OS X 机器上崩溃了。事实证明,字符串命令中的转义字符 (\) 需要一个额外的转义字符 (\\)。

有人能告诉我我在这里遗漏了什么 -- 即,在需要此功能的 Mac 上运行 R 脚本有何意义?

在调用 python3 -c ..

时观察到该行为 *not*

在两台机器上,我都使用bash,特别是/bin/bash

注意:Mac 是 R 的稍晚版本:3.5.1 与 3.4.1,但如果那是罪魁祸首,我会感到非常惊讶。有人可以确认吗?


简单示例:

R --vanilla -e 'cat(" Hello \n World \n ")'

上面的代码在 CentOS 机器上运行良好,但需要一个额外的转义字符(\\n 而不是 \n)才能正确执行。 (底部示例)

作为引用/比较,以下 python 命令在我测试的每台 Mac OS X、CentOS 机器上的工作方式相同。

python3 -c 'print("Hello \n World")'


有关详细信息,这是在两台机器上分别比较两个命令的输出

1. R --vanilla -e 'cat(" Hello \n World \n ")'
2. R --vanilla -e 'cat(" Hello \\n World \\n ")'

1.

R --vanilla -e 'cat(" Hello \n World \n ")'

## CENTOS:
> cat(" Hello \n World \n ")
Hello
World

## MAC OS X:
> cat(" Hello
+
+ Error: unexpected end of input
Execution halted

2.

R --vanilla -e 'cat(" Hello \\n World \\n ")'

## CENTOS:
> cat(" Hello \\n World \\n ")
Hello \n World \n >

## MAC OS X:
> cat(" Hello \n World \n ")
Hello
World

为了比较,我在运行简单的 python 脚本时没有看到相同的行为。

## Each of these produce identical 
## results in Mac OSX as CentOS

python3 -c 'print("Hello \n World")'
python3 -c 'print("Hello \\n World")'


机器和 session 信息:

  1. Linux 盒子
> cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

> R --vanilla -e 'sessionInfo()'
R version 3.4.1 (2017-06-30)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Amazon Linux AMI 2018.03

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

loaded via a namespace (and not attached):
[1] compiler_3.4.1
  1. Mac 操作系统盒
Mojave 10.14.3

> R --vanilla -e 'sessionInfo()'
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS 10.14.3

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats graphics grDevices utils datasets methods base

loaded via a namespace (and not attached):
[1] compiler_3.5.1
  1. 另一台 Mac OSX 机器,运行 3.4.3,同样的错误
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6

最佳答案

跟进我的建议,问题的原因可能是 macOS sed 和 GNU sed 之间的差异和 Charles Duffy's suggestion作为对原始问题的最后评论,我尝试在 macOS Mojave 10.14.3 和 R 3.5.3 上直接调用 R 可执行文件,如下所示:

export R_HOME=$(R RHOME)
Rexec=${R_HOME}/bin/exec/R

$Rexec --vanilla -e 'cat(" Hello \n World \n ")'

并且这不会给出错误消息并给出与在 Linux 上相同的输出。

在我看来,这个问题不是 bash 中的错误,而是 macOS (BSD) 和 GNU sed 之间令人遗憾的差异。如果可能的话,我不知道如何在 R 包装器脚本中更正此问题。

关于r - 为什么在 Mac 和 Linux 上通过 `R -e ..` 的字符串命令需要额外的转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55228434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com