如何在R的item_pool函数中使传入的L1F函数适配dplyr::mutate?
解决方法
你的代码存在两个核心问题:
- 调用
item_pool时,L1F传入的是函数执行后的结果,而非可复用的函数/表达式,导致mutate无法逐行处理数据框的列 dplyr::mutate使用非标准求值逻辑,直接传入函数对象无法自动关联数据框的列
修正后的item_pool函数
使用rlang包的tidy求值工具(enquo和!!)捕获并执行传入的表达式,适配dplyr的非标准求值规则:
library(dplyr) library(rlang) item_pool <- function(df, L1F, w){ # 捕获传入的L1F表达式(保留对列和外部变量的引用) l1_expr <- enquo(L1F) df %>% mutate(L1_Items = !!l1_expr) }
正确调用方式
传入的L1F需要是引用数据框列的表达式,而非立即执行的函数调用。同时注意:原代码中mean(y,z)是对整个向量求均值,若要逐行计算需改用rowMeans:
# 创建数据框 df_ul1 <- data.frame(domain = 1:4, y = c(.25, .25, .25, .25), z = c(.25, .25, .25, .25)) # 调用item_pool,L1F传入基于列的计算表达式 df_ul1_ip <- item_pool(df = df_ul1, L1F = w * rowMeans(cbind(y, z)), w = 20)
可选方案:传入独立函数对象
如果希望L1F是一个可复用的独立函数,可调整函数逻辑直接传入函数并指定参数:
item_pool <- function(df, L1F, w){ df %>% mutate(L1_Items = L1F(w, y, z)) } # 定义独立的计算函数 my_L1F <- function(x, y_col, z_col){ x * rowMeans(cbind(y_col, z_col)) } # 调用函数 df_ul1_ip <- item_pool(df = df_ul1, L1F = my_L1F, w = 20)
内容的提问来源于stack exchange,提问作者Mackson Ncube
相关产品推荐
相关产品推荐

