R 将内存存储库构建到函数中,输出作为下一个输入

R 将内存存储库构建到函数中,输出作为下一个输入,r,R,我在尝试函数时构建了一个快速而肮脏的elo计算器: elo <- function(winner, loser, r1, r2){ player <- c(winner, loser) K <- 32 # smoothing constant R1 <- 10^(r1/400) R2 <- 10^(r2/400) E1 <- R1 / (R1 + R2) E2 <- R2 / (R1 + R2)

我在尝试函数时构建了一个快速而肮脏的elo计算器:

elo <- function(winner, loser, r1, r2){

    player <- c(winner, loser)

    K <- 32 # smoothing constant

    R1 <- 10^(r1/400)
    R2 <- 10^(r2/400)

    E1 <- R1 / (R1 + R2)
    E2 <- R2 / (R1 + R2) 

    S1 <- 1 # Win
    S2 <- 0 # Loss

    rp1 <- r1 + K * (S1 - E1)
    rp2 <- r2 + K * (S2 - E2)

    rating <- c(rp1, rp2)

    data.frame(player, rating)
}
我希望能够只输入赢家和输家(从2000年开始新玩家),并让函数打印出新结果,同时以某种方式存储旧值(使用系统时间戳?)

例如:

elo("M1", "A1")
我只是不知道从哪里开始

如有任何意见,欢迎提出建设性的批评。如果这太宽泛,我道歉

我通过在硬盘上写入和读取.csv文件来保持“分数”:

elo <- function(winner, loser){

    setwd("/Users/firstlast/Documents/R/elo/")
    df <- read.csv("df.csv", header = TRUE)

    if (winner %in% df$player){
        df
    } else {
        df <- rbind(df, data.frame(player = winner, rating = 2000))
    }

    if (loser %in% df$player) {
        df 
    } else {
        df <- rbind(df, data.frame(player = loser, rating = 2000))
    }

    K <- 32 # smoothing constant

    r1 <- df[df$player == winner, 2]
    r2 <- df[df$player == loser, 2]

    R1 <- 10^(r1/400)
    R2 <- 10^(r2/400)

    E1 <- R1 / (R1 + R2)
    E2 <- R2 / (R1 + R2) 

    S1 <- 1 # Win
    S2 <- 0 # Loss

    rp1 <- r1 + K * (S1 - E1)
    rp2 <- r2 + K * (S2 - E2)

    df[df$player == winner, 2] <- rp1
    df[df$player == loser, 2] <- rp2

    write.csv(df, "df.csv", row.names = FALSE)
    return(df)
}

elo创建一个环境,并将任何需要记住的东西分配到该对象中。如何记住?我不明白你在问什么。在您的示例中,您使用不同的参数值调用,那么您将存储什么?有一个软件包允许函数调用值,而不是重新计算,但这似乎与您在这里所做的不太一样。该示例感觉不完整,因为我不确定您想要的输出是什么。@BondedDust any suggestions?@MrFlick any suggestions?
elo <- function(winner, loser){

    setwd("/Users/firstlast/Documents/R/elo/")
    df <- read.csv("df.csv", header = TRUE)

    if (winner %in% df$player){
        df
    } else {
        df <- rbind(df, data.frame(player = winner, rating = 2000))
    }

    if (loser %in% df$player) {
        df 
    } else {
        df <- rbind(df, data.frame(player = loser, rating = 2000))
    }

    K <- 32 # smoothing constant

    r1 <- df[df$player == winner, 2]
    r2 <- df[df$player == loser, 2]

    R1 <- 10^(r1/400)
    R2 <- 10^(r2/400)

    E1 <- R1 / (R1 + R2)
    E2 <- R2 / (R1 + R2) 

    S1 <- 1 # Win
    S2 <- 0 # Loss

    rp1 <- r1 + K * (S1 - E1)
    rp2 <- r2 + K * (S2 - E2)

    df[df$player == winner, 2] <- rp1
    df[df$player == loser, 2] <- rp2

    write.csv(df, "df.csv", row.names = FALSE)
    return(df)
}
df <- data.frame(
    player = c("M1", "A1"), 
    rating = c(2000, 2000)
)