【问题标题】:Why does paste() concatenate list elements in the wrong order?为什么 paste() 以错误的顺序连接列表元素?
【发布时间】:2020-05-19 20:16:54
【问题描述】:

给定以下字符串:

my.str <- "I welcome you my precious dude"

一分为二:

my.splt.str <- strsplit(my.str, " ")

然后连接:

paste(my.splt.str[[1]][1:2], my.splt.str[[1]][3:4], my.splt.str[[1]][5:6], sep = " ")

结果是:

[1] "I you precious"  "welcome my dude"

当不使用冒号运算符时,它会返回正确的顺序:

paste(my.splt.str[[1]][1], my.splt.str[[1]][2], my.splt.str[[1]][3], my.splt.str[[1]][4], my.splt.str[[1]][5], my.splt.str[[1]][6], sep = " ")

[1] "I welcome you my precious dude"

为什么会这样?

【问题讨论】:

    标签: r string strsplit


    【解决方案1】:

    paste 旨在逐个元素地处理向量。假设你这样做了:

    names <- c('Alice', 'Bob', 'Charlie')
    paste('Hello', names)
    

    您希望结果为 [1] "Hello Alice" "Hello Bob" "Hello Charlie",而不是“Hello Hello Hello Alice Bob Charlie”。

    要使其按您希望的方式工作,而不是将不同的部分作为单独的参数提供给 paste,您可以先将它们组合成一个带有 c 的向量:

    paste(c(my.splt.str[[1]][1:2], my.splt.str[[1]][3:4], my.splt.str[[1]][5:6]), collapse = " ")
    ## [1] "I welcome you my precious dude"
    

    【讨论】:

      【解决方案2】:

      我们可以使用collapse 代替sep

      paste(my.splt.str[[1]], collapse= ' ')
      

      如果我们使用 OP 的第一种方法,它是 pasteing 来自每个子集的相应元素

      如果我们要选择性地paste,首先创建一个对象,因为可以避免[[重复

      v1 <- my.splt.str[[1]]
      v1[3:4] <- toupper(v1[3:4])
      paste(v1, collapse=" ")
      #[1] "I welcome YOU MY precious dude"
      

      当我们在paste中有多个参数时,它正在对它的相应元素进行粘贴

      paste(v1[1:2], v1[3:4])
      #[1] "I you"      "welcome my"
      

      如果我们使用collapse,那么它将是单个字符串,但顺序仍然不同,因为v1[1:2] 的第一个元素是pasteed,第一个元素是v1[3:4],第二个是第二个元素

      paste(v1[1:2], v1[3:4], collapse = ' ')
      #[1] "I you welcome my"
      

      记录在?paste

      paste 将其参数(通过 as.character)转换为字符串,并将它们连接起来(用 sep 给出的字符串分隔它们)。如果参数是向量,则将它们逐项连接起来以给出字符向量结果。向量参数根据需要回收,零长度参数回收到 ""。


      此外,也可以在不拆分子字符串的情况下转换为大写

      sub("^(\\w+\\s+\\w+)\\s+(\\w+\\s+\\w+)", "\\1 \\U\\2", my.str, perl = TRUE)
      #[1] "I welcome YOU MY precious dude"
      

      【讨论】:

      • 我知道,但是如果我想让第三个或第四个元素为大写呢?例如。 paste(my.splt.str[[1]][1:2], toupper(my.splt.str[[1]][3:4]), my.splt.str[[1]][5:length(my.splt.str[[1]])], collapse = " ")。这也将返回废话。很抱歉,但它也没有回答问题。
      • 但他解释了正在发生的事情。我不明白这就是collapse 的意思。此外,您为列表元素分配了一个与我的问题不同的变量。
      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多