R 如何在不强制使用数字的情况下迭代日期列表?

R 如何在不强制使用数字的情况下迭代日期列表?,r,list,date,for-loop,R,List,Date,For Loop,这与 >日期类(日期) [1] “日期” >用于(日期中的d)打印(d类) [1] “数字” [1] “数字” 我有两个问题: 迭代日期对象列表的首选方式是什么 我不明白Joshua的答案(接受了上面链接的问题的答案),我在这里引用它:“所以你的Date向量被强制为numeric,因为Date对象并不是严格意义上的向量。”。那么,如何确定应将日期强制为数字 这里有两个问题。一是输入是否从Date强制到numeric。另一个问题是输出是否强制为numeric 输入 For循环强制日期输入到数值,

这与

>日期类(日期)
[1] “日期”
>用于(日期中的d)打印(d类)
[1] “数字”
[1] “数字”
我有两个问题:

  • 迭代日期对象列表的首选方式是什么
  • 我不明白Joshua的答案(接受了上面链接的问题的答案),我在这里引用它:“所以你的
    Date
    向量被强制为
    numeric
    ,因为
    Date
    对象并不是严格意义上的向量。”。那么,如何确定应将
    日期
    强制为
    数字

  • 这里有两个问题。一是输入是否从
    Date
    强制到
    numeric
    。另一个问题是输出是否强制为
    numeric

    输入

    For循环强制
    日期
    输入到
    数值
    ,因为正如@DWin和@JoshuaUlrich所指出的,
    For
    循环采用
    向量
    ,而
    日期
    从技术上讲不是向量

    > for(d in dates) print(class(d))
    [1] "numeric"
    [1] "numeric"
    
    另一方面,
    lappy
    及其简化子代
    sapply
    没有这样的限制

    > sapply( dates, function(day) class(day) )
    [1] "Date" "Date"
    
    输出

    然而!上面的
    class()
    的输出是一个字符。如果您尝试实际返回日期对象,
    sapply
    不是您想要的

    lappy
    不会强制为向量,但
    sapply
    会:

    > lapply( dates, identity )
    [[1]]
    [1] "2013-01-01"
    
    [[2]]
    [1] "2013-01-02"
    
    > sapply( dates, identity )
    [1] 15706 15707
    
    这是因为
    sapply
    的简化函数将输出强制为向量

    摘要

    因此:如果您有一个
    Date
    对象,并且想要返回一个非
    Date
    对象,那么可以使用
    lappy
    sapply
    。如果您有一个非
    Date
    对象,并且希望返回
    Date
    对象,那么可以使用
    for
    循环或
    lappy
    。如果您有一个
    Date
    对象,并且希望返回一个
    Date
    对象,请使用
    lappy

    了解更多信息的资源


    如果您想深入研究向量,可以从开始,继续,然后继续。

    我的评论是:
    是.vector(dates)#FALSE
    ,所以日期不是“向量”。你的第二个问题应该是对我上一个答案的评论。很明显,
    dates
    不是一个向量,它显然是
    Date
    。但是什么让它表现得像一个向量呢。是什么使它变得可用?从帮助页
    ?vector
    。“对于任何模式,如果x具有除名称以外的任何属性,则它[
    is.vector
    ]将返回FALSE。”在R语言中,“vector”并不意味着它可以通过位置访问,而是它没有属性。它特别指出因子不是向量,它可能还应该说明Date和POSIXt分类对象也不是。您可以将
    日期
    保留为字符向量,并在循环中强制执行,或者使用链接帖子中提到的
    seq_-along()
    技术。。。(或下面的答案之一)@JoshuaUlrich@DWin我认为这不是向量的标准定义。日期是向量,但是
    is.vector
    函数令人困惑-它告诉您是否有一个没有属性的原子向量
    是.atomic(as.Date(“2012-01-01”)
    是真的,所以日期是原子向量。
    sapply
    是真的,因为
    simplify2array
    (矩阵只能容纳原子向量)。返回的是类,而不是对象本身。试试:
    sapply(Sys.Date(),identity)
    <代码>Lappy仍然有效。那么打印日期的sapply(日期,类)呢?难道不应该强制使用数值向量吗?(根据帖子和评论)@user443854:正如我所说的,这返回了存在于函数调用中的对象类(一个字符串,它是一个原子向量);它没有返回日期。请允许我给你100美元作为“$100”@JoshuaUlrich矩阵不限于原子向量:
    矩阵(列表(1,2,3,4),nrow=2)
    。我认为真正的解释是,
    simplify2array
    写得不好,或者Date类缺少所需的S3方法。@AriB.Friedman@user443854不,这是不一致的,因为
    for
    是用C写的,不看对象的类,或者使用
    [
    提取向量的各个分量。
    > lapply( dates, identity )
    [[1]]
    [1] "2013-01-01"
    
    [[2]]
    [1] "2013-01-02"
    
    > sapply( dates, identity )
    [1] 15706 15707