3

我有个约会。

这是一个示例(由 生成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"

在这两种情况下,输出都是“字符”类

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

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

唯一的缺点:如果我输入一个包含五个日期的向量,我宁愿不必写 as.character 五次。

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

4

2 回答 2

6

在这两种情况下,输出都是“字符”类

这是不正确的

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

c(mydate)仍然是一个POSIXt对象。打印时,它看起来像一个字符,但它不是一个字符。因为有一个专门的功能,所以c对对象有这种行为。POSIXtc.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(which uses 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"
于 2013-02-27T21:34:11.630 回答
4

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

 ?c

“输出类型由层次结构中组件的最高类型 NULL < 原始 < 逻辑 < 整数 < 实 < 复杂 < 字符 < 列表 < 表达式确定。” 请注意,这实际上是在谈论类型,因为“整数”、“真实”和“复杂”都是“数字”模式。然而,它并不是所有类型的完整列表:

?mode
?typeof

在您的用例中,为什么不使用它:

function(x) paste(paste("'", as.character(x), "'", sep=''), collapse=',')
于 2013-02-27T21:28:54.600 回答