为什么循环 POSIXct 次向量会改变 R 中的类型? [重复]

问题描述 投票:0回答:1

我经常使用 R,但我偶然发现了一些奇怪的事情:

Sys.time() |> class()
times <- Sys.time()+1:3
print(times)
for (tme in times) {
  print(tme)
}
tme %in% times

这给出了输出:

> Sys.time() |> class()
[1] "POSIXct" "POSIXt" 
> times <- Sys.time()+1:3
> print(times)
[1] "2024-01-18 10:00:28 CET" "2024-01-18 10:00:29 CET" "2024-01-18 10:00:30 CET"
> for (tme in times) {
+   print(tme)
+ }
[1] 1705568429
[1] 1705568430
[1] 1705568431
> tme %in% times
[1] FALSE

这种行为如何合理?我发现最后一行特别难以证明(

tme %in% times == FALSE
)。

r posixct
1个回答
2
投票

for
循环中,表达式
times
将被强制转换为
vector
(当您通过键入
?`for`

查看帮助文档时)

计算向量的表达式(包括列表和 表达式)或配对列表或 NULL。因子值将被强制 到字符向量。这可以是一个长向量。

但是,在

vector
中,不会保留任何属性(当输入
?vector
并查看说明时)

向量产生给定长度和模式的“简单”向量,其中 “简单”向量没有属性,即满足 is.null(属性(.)).


要保留所有属性,您可以将

times
中的值转换为列表,例如,您可以在
as.list(times)
循环中使用
for
,如下所示

> for (time in as.list(times)) {
+     print(time)
+ }
[1] "2024-01-18 10:13:39 CET"
[1] "2024-01-18 10:13:40 CET"
[1] "2024-01-18 10:13:41 CET"
© www.soinside.com 2019 - 2024. All rights reserved.