R语言如何结合使用curve()与do.call()函数并解决x参数识别错误
问题原因与修复方案
错误点整理
- list构造语法错误:list内部定义命名元素需使用
=而非<-,你当前的写法会导致list元素无正确命名,同时多余变量泄漏到全局环境 - 变量名冲突:外层函数参数
x与sapply匿名函数的参数x重名,导致内部作用域覆盖了外部传入的x值 - 核心逻辑错误:你将包含自定义配置项(如init、car等)的命名列表直接通过do.call传给mean函数,mean仅支持x、trim、na.rm三个参数,无法识别你传入的自定义字段名,因此抛出「未使用参数」的报错
- 向量化不兼容:curve函数会给传入的函数传递长度大于1的向量x,你当前的tt函数默认只能处理单个x值,直接传入向量会得到长度不符的结果。
修复后代码
tt <- function(x) { # 遍历输入的向量x,适配curve的向量化输入逻辑 sapply(x, function(single_x) { list1 <- list( option1 = c(init=600000 + 600000, depr=000000, il=180, per=180, quant=list(c(45)), pre=list(c(330000)), cust=0, cust_un=list(c(0)), sala=1200, num=0, wacc=0.0082, redr=1, tem=69, capa=2000, cap2=60000, cap3=100000, cap4=1000000, custo2=1200, custo3=1600, custo4=5000, chan=0.30, tempo_nal=0, redu_lucr=00, redu_qt=0, aumen_cf=0.3, redu_lucrofinal=0.2, redu_qtdfinal=0.1, aumen_cffi=0.80, final=0000, iniceco=210000, finreco=250000, iniv=40000, fiv=65000, ininda=000, percionario=1, n=80, PV=1300000, i=0.008, temrmal=1, temeio=0, car=single_x) ) # 提取所有非列表类型的数值字段计算均值,可根据你的实际需求调整此处逻辑 opt_vals <- list1$option1 num_vals <- unlist(opt_vals[!sapply(opt_vals, is.list)]) return(mean(num_vals)) }) } # 可正常绘图 curve(tt, from=3, to=120)
如果你的计算需求不是求所有配置项的均值,只需要修改代码中mean(num_vals)部分的逻辑即可,核心原则是不要将整段带自定义命名的配置列表直接作为参数传给mean等内置函数。
内容的提问来源于stack exchange,提问作者RoBrT
相关产品推荐
相关产品推荐

