我经常使用 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
)。
在
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"