如何让此自定义函数与 lapply 一起使用?

How can I get this custom function to work with lapply?

我正在尝试使用此处找到的自定义函数进行效果分析:https://github.com/phuais/multifit/blob/master/multifit.R

当我单独 运行 每个元素时,它对 SAND_lc_list 的每个列表元素都工作正常,没有错误或警告。

test <- multifit(mod = "glm", 
                    multief = buffer_names,     #column names
                    formula = presence ~ multief,
                    args = c("family = binomial"),
                    data = as.data.frame(SAND_lc_list[[9]]),      #which landcover variable
                    criterion = "AIC",
                    plot_est = T,
                    site_id = "Plot",
                    print_sum = TRUE)

The model including the effect 'r7500' was the best model according to the specified criterion (AIC, which.min)

Call:
glm(formula = presence ~ r7500, family = binomial, data = as.data.frame(SAND_lc_list[[9]]))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.8244  -0.1537  -0.1160  -0.1051   3.1663  

Coefficients:
            Estimate Std. Error z value        Pr(>|z|)    
(Intercept)  -5.3623     0.7944  -6.750 0.0000000000148 ***
r7500         8.2955     2.5777   3.218         0.00129 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 59.491  on 316  degrees of freedom
Residual deviance: 49.625  on 315  degrees of freedom
AIC: 53.625

Number of Fisher Scoring iterations: 7

但是,当我尝试使用 lapply 将函数应用于列表的每个元素时,出现以下错误。

SAND_models <- lapply(SAND_lc_list, function(x) multifit(mod = "glm", 
                                                         multief = buffer_names,     #column names
                                                         formula = presence ~ multief,
                                                         args = c("family = binomial"),
                                                         data = as.data.frame(x),     
                                                         criterion = "AIC",
                                                         plot_est = T,
                                                         site_id = "Plot",
                                                         print_sum = TRUE))

Warning messages:
1: Fatal errors were found in all the models. Check them out by typing $Models to the generated object

> SAND_models$barren$models
$r200
<simpleError in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': object 'x' not found>


我猜我不明白 lapply 如何处理 x - 我不知道它是通过 SAND_lc_list[i] 还是 SAND_lc_list[[i] ] 到函数。我还想知道它是否与自定义函数的结构有关。

关于如何完成这项工作有什么想法吗?

如果 foreach 不起作用,则遍历序列并提取对象

lapply(seq_along(SAND_lc_list), function(i) {
      tmp <- as.data.frame(SAND_lc_list[[i]])
      multifit(mod = "glm", 
                    multief = buffer_names,     #column names
                    formula = presence ~ multief,
                    args = c("family = binomial"),
                    data = tmp,    
                    criterion = "AIC",
                    plot_est = TRUE,
                    site_id = "Plot",
                    print_sum = TRUE)})

如果对象正在使用替代品,这可能是个问题

out_lst <- vector('list', length(SAND_lc_list))
for(i in seq_along(SAND_lc_list)) {
    expr <- sprintf('multifit(mod = "glm", 
                    multief = buffer_names,     #column names
                    formula = presence ~ multief,
                    args = c("family = binomial"),
                    data = as.data.frame(SAND_lc_list[[%d]]),    
                    criterion = "AIC",
                    plot_est = TRUE,
                    site_id = "Plot",
                    print_sum = TRUE)', i)
    out_lst[[i]] <- eval(parse(text = expr))
}