为什么在R中优先使用双引号而不是单引号?

18

根据 help("'")

单引号和双引号限定字符常量。它们可以互换使用,但双引号更受欢迎(并且字符常量使用双引号进行打印),因此通常只使用单引号来限定包含双引号的字符常量。

如果它们是可互换的,为什么双引号更受欢迎?我在自己的使用中尚未发现它们之间的区别。特别令人惊讶的是混合字符向量是允许的:

> c("a",'b',"c")
[1] "a" "b" "c"

编辑

我想这里实际上有两个问题:

  1. '" 有任何情况下的使用方式不同吗?
  2. 如果没有,按照约定为什么选择了 " 作为首选版本?

到目前为止的答案都与问题(2)有关,但(1)同样重要。


1
一种可能性是:使用不常用的字符,如反引号和重音符号,以及在文本数据中使用单引号(例如在名称中,如“O'Reilly”),可以减少混淆的机会。 - Glen_b
2
据我所知,这份文档是由Brian Ripley于2005年6月14日添加的:https://github.com/wch/r-source/commit/d5871a12861d420cc7821e7523dfcd57e1316fcf#src/library/base/man/Quotes.Rd - Ben Bolker
4个回答

12

我不知道任何单引号与双引号有所不同的情况。我认为偏好是由于可读性和避免将单引号与被处理不同的反引号混淆而产生的。对于眼睛和大脑系统来说,很难发现一个不匹配的反引号与单引号成对出现。

> `newfn` <- function() {}
> newfn
function() {}
> "newfn" <- function() {}
> newfn
function() {}
> 'newfn' <- function() {}
> newfn
function() {}
> var <- c(`a`, "b", 'c')
Error: object 'a' not found
> var <- c( "b", 'c')
> var
[1] "b" "c"
> a <- 1
> identical(`a`, a)
[1] TRUE

对于变量名的赋值,单引号、双引号和反引号(分别表示为s-quotes、d-quotes和back-ticks)在从函数赋值的左侧都被处理相同。但是在命令行上,未加引号的a和用反引号括起来的a是相同的,且不同于任何一个用单引号或双引号括起来的字符。

可能存在另一种情况,即在数据输入时。人名中可能包含单引号,您可能需要查看read.table函数对两种不同引号类型的处理方式。默认情况下,它使用这两种引号,但可能需要通过设置quote="\""来“关闭”单引号的引用操作,以免因错误而将大块数据转换为单个文本字段。 count.fields函数与read.table具有相同的默认值,因此可以进行初步运行以检查由于不匹配的单引号导致的缩短行:

 table( count.fields('filnam.ext') )

7

我猜"单引号"更经常用作撇号,因此优先使用双引号可以减少使用撇号出错的可能性。


3

关于第一个问题,'和"在什么情况下会有不同的行为?,我认为重要的是要注意,由于

identical("a", 'a')
TRUE

R 用户(包括包开发人员)无法区分这两者,因此也没有办法为其中之一创建不同的行为。


没错,但仍可能存在解析器差异。 - Ari B. Friedman

2
为了避免那些习惯于使用C语言家族(C、C++、Java)的程序员混淆,需要注意单引号和双引号的含义不同。在C语言中,程序员将'a'读作一个字符,而将"a"读作由字母'a'后面跟着一个空字符来终止字符串的字符串。在R中,没有字符数据类型,只有字符串。为了与其他语言保持一致,最好使用双引号来界定字符串。R中的单引号版本是为了方便而存在的。在大多数键盘上,您无需使用Shift键即可键入单引号,但对于双引号,则必须使用Shift键。

1
为了与其他语言保持一致,最好使用双引号来界定字符字符串。但这取决于你所说的其他语言是什么。Perl程序员会发现使用单引号更加一致,因为R字符串永远不会被解释。http://www.dummies.com/how-to/content/contrasting-single-and-double-quotes-in-perl.html - flodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接