18

来自help("'")

单引号和双引号分隔字符常量。它们可以互换使用,但首选双引号(字符常量使用双引号打印),因此单引号通常仅用于分隔包含双引号的字符常量。

如果它们可以互换,为什么首选双引号?在我自己的用法中,我还没有发现它们之间的区别。特别令人惊讶的是允许混合字符向量:

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

编辑

我真的在这里问两个问题,我猜:

  1. 是否有任何情况'"行为不同?
  2. 如果不是,为什么"按惯例被选为首选版本?

到目前为止,答案都与 (2) 有关,但 (1) 至少同样令人感兴趣。

4

4 回答 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)在 LHS 的分配 from 上都是相同的处理方式,但未引用和反function引号在命令行上是相同的,并且是不同于引用的“a”或“a”。aa

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

 table( count.fields('filnam.ext') )
于 2012-11-30T02:44:45.453 回答
7

我的猜测是“单引号”更频繁地作为撇号出现,因此更喜欢双引号将减少用撇号搞砸事情的机会。

于 2012-11-30T02:26:19.380 回答
3

关于第一个问题,在任何情况下 ' 和 " 的行为是否不同?,我认为重要的是要注意,因为

identical("a", 'a')
TRUE

R 用户(包括包开发人员)无法区分两者,因此无法为其中一个或另一个创建不同的行为。

于 2012-11-30T12:14:34.783 回答
2

为了避免那些习惯于使用 C 系列语言(C、C++、Java)编程的人感到困惑,因为单引号和双引号的含义有所不同。AC 程序员将“a”读取为单个字符,将“a”读取为由字母“a”组成的字符串,后跟一个空字符以终止字符串。在 R 中没有字符数据类型,只有字符串。为了与其他语言保持一致,如果字符串用双引号分隔会很有帮助。R 中的单引号版本是为了方便。在大多数键盘上,您不需要使用 shift 键来输入单引号,但您确实需要 shift 来输入双引号。

于 2012-11-30T05:18:49.940 回答