【问题标题】:My R function is returning a vector that is larger than expected我的 R 函数返回的向量大于预期
【发布时间】:2022-11-10 15:51:27
【问题描述】:

我有一个班级作业,任务是在 R 中创建一个函数,该函数接受一个值向量并将它们在华氏、摄氏和开尔文之间转换。我尝试通过我的代码运行的示例应该生成一个仅包含 3 个值的返回向量,但它返回一个包含 26 个值的向量。

下面是我的代码:

convTemp <- function(x, from = "C", to = "F") {
    newX <- vector("double", length(x))
    if (from == to) {
        warning("Your 'from' parameter is the same as your 'to' parameter!") # From and To are same temperature scale
    }
    if (from == "C" && to == "F") { # Celsius to Fahrenheit
        for (i in x) {
            newX[i] <- ((9/5)*x[i]+32)
        }
    }
    if (from == "C" && to == "K") { # Celsius to Kelvin
        for (i in x) {
            newX[i] <- (x[i]+273.15)
        }
    }
    if (from == "F" && to == "C") { # Fahrenheit to Celsius
        for (i in x) {
            newX[i] <- ((x[i]-32)*(5/9))
        }
    }
    if (from == "K" && to == "C") { # Kelvin to Celsius
        for (i in x) {
            newX[i] <- (x[i]-273.15)
        }
    }
    if (from == "F" && to == "K") { # Fahrenheit to Kelvin
        for (i in x) {
            newX[i] <- ((((x[i]-32)*5)/9)+273.15)
        }
    }
    if (from == "K" && to == "F") { # Kelvin to Fahrenheit
        for (i in x) {
            newX[i] <- ((((x[i]-273.15)*9)/5)+32)
        }
    }
    return(newX)
}

convTemp(c(35,40,45), from="F", to="K")

这是我收到的输出:

 [1]  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[26] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

所以我不确定为什么该函数应该返回一个包含 3 个 Kelvin 值的向量时返回如此大的缺失值向量。

【问题讨论】:

    标签: r function vector


    【解决方案1】:

    在代码中,我们不需要for(i in x),而是for(i in seq_along(x)),因为我们需要遍历序列

    convTemp <- function(x, from = "C", to = "F") {
        newX <- vector("double", length(x))
        if (from == to) {
            warning("Your 'from' parameter is the same as your 'to' parameter!") # From and To are same temperature scale
        }
        if (from == "C" && to == "F") { # Celsius to Fahrenheit
            for (i in seq_along(x)) {
                newX[i] <- ((9/5)*x[i]+32)
            }
        }
        if (from == "C" && to == "K") { # Celsius to Kelvin
            for (i in x) {
                newX[i] <- (x[i]+273.15)
            }
        }
        if (from == "F" && to == "C") { # Fahrenheit to Celsius
            for (i in x) {
                newX[i] <- ((x[i]-32)*(5/9))
            }
        }
        if (from == "K" && to == "C") { # Kelvin to Celsius
            for (i in x) {
                newX[i] <- (x[i]-273.15)
            }
        }
        if (from == "F" && to == "K") { # Fahrenheit to Kelvin
            for (i in x) {
                newX[i] <- ((((x[i]-32)*5)/9)+273.15)
            }
        }
        if (from == "K" && to == "F") { # Kelvin to Fahrenheit
            for (i in x) {
                newX[i] <- ((((x[i]-273.15)*9)/5)+32)
            }
        }
        return(newX)
    }
    
    convTemp(c(35,40,45), from="F", to="K")
    

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 2023-01-26
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2015-09-02
      • 2018-03-03
      相关资源
      最近更新 更多