我的修剪器发生了什么事?

时间:2018-03-24 04:35:12

标签: r regex trim

当我遇到一个有趣的事情时,我正在摆弄文字清理。

可重复代码:

trimws(list(c("this is an outrante", " hahaha", " ")))

输出:

[1] "c(\"this is an outrante\", \" hahaha\", \" \")"

我已经检查了 trimws 文档,除了它需要一个字符向量这个事实之外,它没有进入任何细节,在我的例子中,我是'提供了一系列字符向量列表。我知道我可以使用 lapply 来轻松解决这个问题,但我想了解的是我的修剪器是怎么回事?

1 个答案:

答案 0 :(得分:3)

trimws将直接应用于vector,而不是list

根据?trimws文档,用法是

  

trimws(x,其中= c("两者","左","右")

其中

  

x-一个字符向量

目前尚不清楚为什么vector包含在list

trimws(c("this is an outrante", " hahaha", " "))

如果确实需要list,请使用list元素中的一个函数并应用trimws

lapply(list(c("this is an outrante", " hahaha", " ")), trimws)

另请注意,OP的list长度为list,可以vector或{[[1]]转换回unlist {1}}(更一般)

trimws(list(c("this is an outrante", " hahaha", " "))[[1]])

关于函数为什么会这样做,它应该有一个输入参数作为vector。对于期望vector的其他函数,行为类似于例如

paste(list(c("this is an outrante", " hahaha", " ")))
as.character(list(c("this is an outrante", " hahaha", " ")))

如果我们检查trimws功能,则会调用正则表达式sub,这需要vector

mysub <- function(re, x) sub(re, "", x, perl = TRUE) 
mysub("^[ \t\r\n]+", list(c("this is an outrante", " hahaha", " ")))
#[1] "c(\"this is an outrante\", \" hahaha\", \" \")"

传递vector

mysub("^[ \t\r\n]+", c("this is an outrante", " hahaha", " "))
#[1] "this is an outrante" "hahaha"              ""