R - as的结果.字符取决于矢量内容(re:粘贴POSIX日期-时间)



我有个约会。

下面是一个例子(由mydate <- lubridate::now()生成):

mydate <- structure(1361998255.23362, class = c("POSIXct", "POSIXt"), tzone = "")

如果我把它放在一个向量中,它看起来就没问题了:

(基于@joran的评论,我减少了最初使用as.character的例子,只使用c。现在我提供这两种情况)

> c(mydate)
[1] "2013-02-27 14:50:55 CST"
> as.character(mydate)
[1] "2013-02-27 14:50:55"

但是,如果我尝试将它与另一个字符元素组合,日期时间格式将被剥离:

> c('a', mydate)
[1] "a"                "1361998255.23362"
> as.character('a', mydate)
[1] "a"                "1361998255.23362"

在这两种情况下,输出都是类"character"

为什么c会根据输入向量的内容提供不同的结果?添加as.character(mydate)是一个合适的解决方案吗?

> c('a', as.character(mydate))
[1] "a"                   "2013-02-27 14:50:55"

唯一的缺点是:如果我输入一个有五个日期的向量,我宁愿不必写为。字符五次

context:上面是一个最小的可重复的例子。上下文是我将一个矢量传递给一个函数,该函数将矢量转换为逗号分隔的字符串,用于编写sql语句:function(x) paste(paste("'", x, "'", sep=''), collapse=',')

在这两种情况下,输出都是类"character"

这是不正确的

> class(c(mydate))
[1] "POSIXct" "POSIXt" 
> dput(c(mydate))
structure(1361998255.23362, class = c("POSIXct", "POSIXt"))

c(mydate)仍然是POSIXt对象。打印时,它看起来像一个字符,但它不是一个字符。cPOSIXt对象具有此行为,因为有一个专门的c.POSIXct函数。

在第二种情况下,第一个参数是一个字符,因此它默认为c的(内部)版本。这做了两件事:它剥离除名称以外的属性,并将其提升为可以表示所有元素的类型(请参阅c的帮助页面)。剥离mydate的属性得到

> as.vector(mydate)
[1] 1361998255

将数字提升为字符得到

> as.character(as.vector(mydate))
[1] "1361998255.23362"

这个字符串现在与"a"连接在一起,以给出您看到的结果。

> c('a', mydate)
[1] "a"                "1361998255.23362"

对于多个as.character()调用以在正确的时间获得强制转换,您可以将所有日期与c(使用c.POSIXct)和调用as.character一起包装在一起

> c('a', as.character(c(mydate, mydate)))
[1] "a"                   "2013-02-27 12:50:55" "2013-02-27 12:50:55"

c()函数强制转换为"公分母类型"。当您连接数字和字符向量时,您将获得所有字符值。当你把一个逻辑向量和一个数字向量结合起来时,你得到的都是数值。如果您希望这些模式保持独立,那么使用list()函数而不是c()函数。完整的层次结构列在

 ?c

"输出类型由层次结构中最高的组件类型决定NULL <原始&>

?mode
?typeof

在你的用例中为什么不使用这个:

function(x) paste(paste("'", as.character(x), "'", sep=''), collapse=',')

最新更新