为什么在R的nls()中无法用数值列选择器替换名称列选择器?
问题原因与解决方案
错误根源
nls()的公式解析逻辑要求公式中用到的变量优先从传入的data参数中读取,你直接将全局环境中的x_dat、y_dat向量写入公式,属于不符合函数设计逻辑的用法。之前y变量的写法能跑通属于偶然情况,当公式右侧也出现全局环境变量时,nls()的公式解析器逻辑混乱就会触发语法报错。
正确实现方案
方案1:预处理变量存入数据框(适用固定逻辑场景)
将需要用到的x、y列提前处理后存入传入nls()的数据集,公式直接调用数据框内的变量即可:
data <- iris x <- 3 y <- 2 # 预处理x、y列存入数据框 data$y_val <- as.numeric(data[[y]]) data$x_val <- as.numeric(data[[x]]) # 调用数据框内变量构建公式 fm0 <- nls( formula = log(y_val) ~ log(a) + b * x_val, start = list(a = 1, b = 1), data = data ) fm0
方案2:动态构建公式(适用Shiny动态选列场景)
用reformulate()函数根据用户选择的列序号/列名动态生成公式,完全适配Shiny交互场景,代码通用性更强:
data <- iris x <- 3 y <- 2 # 根据选中的列序号获取列名 y_col <- names(data)[y] x_col <- names(data)[x] # 动态生成回归公式 form <- reformulate( termlabels = c("log(a)", paste0("b * ", x_col)), response = paste0("log(", y_col, ")") ) fm0 <- nls( formula = form, start = list(a = 1, b = 1), data = data ) fm0
以上两种方案均可正常输出回归结果,Shiny场景下直接将x、y替换为输入组件返回的列序号/列名即可使用。
内容的提问来源于stack exchange,提问作者Steven Ouellette
相关产品推荐
相关产品推荐

