如何在R自定义函数中判断变量是否存在,否则使用用户提供的值?
R自定义函数兼容数据列名与数值输入的修改方案
我编写了一个带有data参数的R自定义函数如下:
Ploy <- function(data, Sepal.Length = "Sepal.Length", Sepal.Width = "Sepal.Width", Petal.Width = "Petal.Width", Petal.Length = "Petal.Length"){ Sepal.Length = data[[Sepal.Length]] Sepal.Width = data[[Sepal.Width]] Petal.Width = data[[Petal.Width]] Petal.Length = data[[Petal.Length]] #Calculate some derived parameters deltak <- (Sepal.Length - Sepal.Width)/390 ARk <- Petal.Width*2 dat <- cbind.data.frame(deltak, ARk) #Fitting quadratic model mod <- lm(deltak ~ poly(ARk, 2, raw = TRUE)) deltaK0 <- abs(mod$coefficients[[1]]) Ks <- Petal.Length - deltaK0 return(list(`DeltaK0` = deltaK0, `Ks` = Ks)) }
当所有变量都对应数据框(如iris)中的列时,函数运行正常:
Ploy(Sepal.Length = "Sepal.Length", Sepal.Width = "Sepal.Width", Petal.Width = "Petal.Width", Petal.Length = "Petal.Length", data = iris)
但为Petal.Length传入数值(如55)时:
Ploy(Sepal.Length = "Sepal.Length", Sepal.Width = "Sepal.Width", Petal.Width = "Petal.Width", Petal.Length = 55, data = iris)
会触发报错:
Error in .subset2(x, i, exact = exact) : subscript out of bounds
需求是实现:若Petal.Length是数据框中的列名则使用数据中的值,否则直接使用用户传入的数值,该如何修改函数?
修改后的函数
Ploy <- function(data, Sepal.Length = "Sepal.Length", Sepal.Width = "Sepal.Width", Petal.Width = "Petal.Width", Petal.Length = "Petal.Length"){ Sepal.Length = data[[Sepal.Length]] Sepal.Width = data[[Sepal.Width]] Petal.Width = data[[Petal.Width]] # 处理Petal.Length的逻辑:如果是列名则取数据值,否则直接用传入的数值 if(is.character(Petal.Length) && Petal.Length %in% colnames(data)){ Petal.Length = data[[Petal.Length]] } # 额外处理:如果传入的数值长度为1,自动重复匹配数据行数 else if(length(Petal.Length) == 1){ Petal.Length = rep(Petal.Length, nrow(data)) } #Calculate some derived parameters deltak <- (Sepal.Length - Sepal.Width)/390 ARk <- Petal.Width*2 dat <- cbind.data.frame(deltak, ARk) #Fitting quadratic model mod <- lm(deltak ~ poly(ARk, 2, raw = TRUE)) deltaK0 <- abs(mod$coefficients[[1]]) Ks <- Petal.Length - deltaK0 return(list(`DeltaK0` = deltaK0, `Ks` = Ks)) }
修改说明
- 增加
if-else判断逻辑:先检查Petal.Length是否为字符型且存在于数据框列名中,满足则取数据列的值; - 补充长度为1的数值输入处理:自动重复数值以匹配数据框的行数,避免后续计算因长度不匹配报错;
- 其他变量逻辑保持不变,依然从数据框读取对应列的值。
现在测试传入数值的情况:
Ploy(Sepal.Length = "Sepal.Length", Sepal.Width = "Sepal.Width", Petal.Width = "Petal.Width", Petal.Length = 55, data = iris)
可以正常返回结果,同时兼容传入列名的原有使用方式。
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

