R中使用cragg包结合map迭代时报object is not a matrix错误如何解决
报错原因
该错误由公式表达式未按预期求值导致:cragg_donald函数的Z参数需要接收右侧为变量名的公式对象,而purrr迭代时传入的.x是字符串类型,你在公式内直接写.x %>% as.name()的写法不会被提前求值,函数最终拿到的是未解析的表达式,无法对应到数据框中的实际列,内部处理时就会抛出object is not a matrix的报错。
解决方案
下面两种写法都可以正常运行:
方案1:基础R动态构造公式
将迭代的变量名拼接为公式字符串后转成公式对象传入:
y <- data.frame(gender = rbinom(100, 1, 0.5), age = rnorm(100), vcam = rnorm(100), rs6696259 = rbinom(100, 2, 0.5), rs5491 = rbinom(100, 2, 0.5)) purrr::map(c("rs6696259", "rs5491"), ~ cragg_donald( X =~ gender + age, D =~ vcam, Z = as.formula(paste0("~ ", .x)), data = y ) )
方案2:整洁栈元编程注入
用rlang的符号注入逻辑把变量名提前注入到公式中:
library(rlang) y <- data.frame(gender = rbinom(100, 1, 0.5), age = rnorm(100), vcam = rnorm(100), rs6696259 = rbinom(100, 2, 0.5), rs5491 = rbinom(100, 2, 0.5)) purrr::map(c("rs6696259", "rs5491"), ~ cragg_donald( X =~ gender + age, D =~ vcam, Z =~ !!sym(.x), data = y ) )
内容的提问来源于stack exchange,提问作者love-learning
相关产品推荐
相关产品推荐

