R语言自定义函数报错:'Sepal.Length'未找到,求解决方案
问题解决:函数调用时
'Sepal.Length' not found错误 错误原因
问题出在非标准求值逻辑:当你调用myfun(iris, Sepal.Length)时,R会默认在全局环境中查找Sepal.Length变量,而非从传入的mydata数据框中提取对应列。with()函数的作用域是mydata,但参数myvar作为符号传入后,没有被正确关联到数据框的列上。
解决方案
提供两种简洁的修正方式:
方法1:整洁评估(推荐,适配tidyverse风格)
用{{}}(大括号运算符)将参数myvar注入到with()的环境中,让R正确识别这是数据框内的列:
myfun <- function(mydata, myvar){ res <- NULL a <- with(mydata, sum({{myvar}}[Petal.Width<0.2])) b <- with(mydata, sum({{myvar}}[Petal.Width<0.7])) cc <- with(mydata, sum({{myvar}}[Petal.Width<1])) d <- with(mydata, sum({{myvar}}[Petal.Width<3])) e <- (b-a) f <- (cc-b) g <- (d-cc) res <- c(e,f,g) }
调用方式保持不变:
h <- myfun(iris, Sepal.Length)
方法2:字符串传参+数据框索引
如果习惯用字符串指定列名,可通过[[直接索引数据框列:
myfun <- function(mydata, myvar){ res <- NULL target_col <- mydata[[myvar]] a <- sum(target_col[mydata$Petal.Width<0.2]) b <- sum(target_col[mydata$Petal.Width<0.7]) cc <- sum(target_col[mydata$Petal.Width<1]) d <- sum(target_col[mydata$Petal.Width<3]) e <- (b-a) f <- (cc-b) g <- (d-cc) res <- c(e,f,g) }
调用时需传入字符串格式的列名:
h <- myfun(iris, "Sepal.Length")
额外优化建议
可以把宽度阈值设为参数,让函数更灵活,同时简化重复计算逻辑:
myfun <- function(mydata, myvar, thresholds = c(0.2, 0.7, 1, 3)){ # 计算各阈值对应的总和 sums <- sapply(thresholds, function(thresh){ with(mydata, sum({{myvar}}[Petal.Width < thresh])) }) # 计算相邻总和的差值 diff(sums) } # 调用示例 h <- myfun(iris, Sepal.Length) # 自定义阈值 h_custom <- myfun(iris, Petal.Length, thresholds = c(0.3, 0.8, 1.2))
内容的提问来源于stack exchange,提问作者dnem
相关产品推荐
相关产品推荐

