【问题标题】:R zero or one based? [closed]R 从零还是从一开始? [关闭]
【发布时间】:2012-12-29 22:08:55
【问题描述】:

我们在 R 中有以下代码(已被剥离以进行调试)

tgtStart = 29593
for (i in tgtStart:tgtStart)
{
    PricerData[i, 1] = 111
}
print(PricerData[29592,1])

PricerData 是一个远远超过 29593 的矩阵,并且预先填充了 NA。

我不明白的是 PricerData[29592, 1] 将更改为 111,此代码打印 111,而不是我们预期的 NA。

为了更详细一点,我今天结束的代码是:

tgtStart = 29593
for (i in tgtStart:tgtStart)
{
    print(PricerData[i,1])
    print(PricerData[i-1,1])

    PricerData[i, 1] = 111

    print(PricerData[i,1])
    print(PricerData[i-1,1])
}
print(PricerData[29592,1])

它将打印:

[1] NA
[1] NA
[1] 111
[1] NA
[1] 111

到最后一切如预期,为什么哦为什么我们开始之前的元素改变了?为什么不在循环中,只有在 for 循环关闭之后(哦,如果我们将 29593 更改为 29596,一切都按预期工作,我不明白。)。

另外,我不编写 R,通常我在做 C++,我理解 R 是基于它的向量的,但请不要介意涵盖真正的基础知识。我们使用 R 版本 2.4.1.5,x64

编辑: 好的,很明显我从我们的代码中删减了太多,所以对你来说问题就解决了,这是完整的功能,供参考,我不明白上面给出的输出

LoadPricer <- function(instrument, colo, simDate, sliceSize, startTime, endTime, pricerName, pricerSettings, returnEmptyMatrixIfFileNotFound = FALSE)
{

  fileName <- paste ( simulatorOutputBasePath, instrument, '\\', colo, '\\', format(simDate, '%Y%m%d'), '\\', sliceSize, '\\P#', pricerName, '#', pricerSettings, '.csv', sep='')   
    firstSliceRequest = GetSlicesSinceMidnight(startTime, sliceSize)
    lastSliceRequest = GetSlicesSinceMidnight(endTime, sliceSize)

    PricerData = as.matrix(matrix(NA, nrow=(lastSliceRequest - firstSliceRequest + 1), ncol = 1))

    if (file.exists(fileName))
    {
        # Load entire file
        AllData = as.data.frame(read.csv(fileName, header = TRUE, colClasses=c("customTimeFormat","numeric")))

        if (dim(AllData)[1] > 0)
        {
            firstSliceData = GetSlicesSinceMidnight(as.POSIXlt(AllData[1,1]), sliceSize)
            lastSliceData = GetSlicesSinceMidnight(as.POSIXlt(AllData[nrow(AllData),1]), sliceSize)

        if ( firstSliceData <= lastSliceRequest & lastSliceData >= firstSliceRequest )
            {
                tgtStart = max(1, firstSliceData - firstSliceRequest + 1)
                tgtEnd = min(lastSliceRequest - firstSliceRequest + 1, lastSliceData - firstSliceRequest + 1)
                srcStart = max(1, firstSliceRequest - firstSliceData + 1)
                srcEnd = min(lastSliceData - firstSliceData + 1, srcStart + tgtEnd - tgtStart)

        #PricerData[as.integer(tgtStart):as.integer(tgtEnd),1] = AllData[as.integer(srcStart):as.integer(srcEnd),2]
        for (i in tgtStart:tgtStart)
        {
          PricerData[i, 1] = 111# as.matrix(AllData[srcStart+i-tgtStart , 2])
        }
            }
        }
    }
    else
    {
        if (returnEmptyMatrixIfFileNotFound) PricerData = matrix(NA, nrow=0, ncol=2)
        print(paste('WARNING: Unable to load Pricer! File:', fileName))
    }

    return (PricerData)
}

【问题讨论】:

  • 这对我来说很好。我怀疑您在不小心将111 写入PricerData[29592,1] 后忘记重新初始化PricerData
  • 我更新了完整的代码,如您所见,PricerData 被单独留下。我发布的带有 5 个打印件的 sn-p 就是这样运行的……在这个上下文中
  • 你为什么要for (i in tgtStart:tgtStart)?为什么不直接分配PricerData[tgtStart, 1]?另外,为什么不在作业前打印tgtStart
  • 看,改变这个值的唯一方法是你无意中告诉 R 去改变它。你只需要弄清楚在哪里。到目前为止,您向我们提供的信息并不能真正让我们轻松地为您调试代码(无论如何这都是题外话)。
  • 你为什么要为 (i in tgtStart:tgtStart)?为什么不直接分配 PricerData[tgtStart, 1]? : 在我们开始剥离和发现这种情况之前的代码遗留问题。我确实在另一次尝试中打印了 tgtStart,它打印了 29593 off course :)

标签: r indexing


【解决方案1】:

基于一个

> PricerData <- matrix(NA, 30000, ncol=1)
> tgtStart <- 29593
> for (i in tgtStart:tgtStart) PricerData[i, 1] <- 111
> print(PricerData[29592, 1])
[1] NA
> print(PricerData[29593, 1])
[1] 111

【讨论】:

    【解决方案2】:

    但是你从 tgtStart=29593 开始

    所以它将执行 i= 29593,因此它将替换 PricerData[29593, 1] = 111,而不是 PricerData[29592, 1]

    > tgtStart = 29593
    > for (i in tgtStart:tgtStart)
    > {
    >  PricerData[i, 1] = 111
    > }
    > print(PricerData[29592,1])
    [1] NA
    > print(PricerData[29593,1])
    [1] 111
    

    【讨论】:

    • 嗯,确实如此 :( 我现在发布了完整的代码,我不明白为什么它会打印出来......
    猜你喜欢
    • 2022-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多