我有个约会。
下面是一个例子(由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
对象。打印时,它看起来像一个字符,但它不是一个字符。c
对POSIXt
对象具有此行为,因为有一个专门的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=',')