5

R には次のコードがあります (既にデバッグ用に骨まで削られています)。

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

PricerData は、29593 をはるかに超えて構築され、NA が事前に入力されたマトリックスです。

私が理解していないのは、PricerData[29592, 1] が 111 に変更されるということです。このコードは、予想した NA ではなく、111 を出力します。

もう少し精巧にするために、今日のコードは次のとおりです。

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

最後まで予想通り どうして oh どうして スタート前の要素が変わったの? そして、なぜループではなく、for ループを閉じた後にのみです (ああ、29593 を 29596 に変更すると、すべてが期待どおりに機能しますが、私には理解できません)。

また、私は R のコーディングはしません。通常は C++ を使用しています。R はそのベクトルに基づく 1 ベースであることを理解する必要がありますが、本当の基本をカバーすることを気にしないでください。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)
}
4

2 に答える 2

10

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
于 2013-01-15T18:15:04.747 に答える
0

しかし、あなたは tgtStart=29593 で始めます

したがって、i= 29593 を実行するため、PricerData[29592, 1] ではなく、PricerData[29593, 1] = 111 を置き換えます。

> tgtStart = 29593
> for (i in tgtStart:tgtStart)
> {
>  PricerData[i, 1] = 111
> }
> print(PricerData[29592,1])
[1] NA
> print(PricerData[29593,1])
[1] 111
于 2013-01-15T18:18:25.630 に答える