R循环函数参数以将变量添加到数据框

R loop over a function argument to add variables to data frame

我是 R 的新手,经过数小时的尝试和搜索类似问题的答案后,我仍然无法弄清楚如何在整数 n 上循环下面的代码,而不是为每个 n 写一行。

d <- data.frame(s = seq(0, 0.125, 0.001))
f <- function(n, s, x) {
    (1 - 2*sqrt(2*s) + x)^(n - 1)*(1 - 2*sqrt(2*s) + (1 + n)*x) - 1)
}

d <- d %>% 
    mutate(p_2 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=2,d$s),
           p_3 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=3,d$s),
           p_4 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=4,d$s),
           p_5 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=5,d$s))

下面确实重复打印了我试图添加到我的数据框 d 的变量,

for (i in c(2:10)){
mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s) %>% print()
}

但是当我尝试将其与循环内的 mutate 函数一起使用时,只有一个新变量被添加到名称为“p_i”的数据框中,该变量的值将是“p_10”:

for (i in 2:10){
    d <- d %>% mutate(p_i = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s))
}

如何让 R 循环遍历 n 并为每次迭代附加一个新变量?如果我遗漏了一个明显的错误或者根本不需要使用 for 循环来完成这项工作,我深表歉意。任何帮助将不胜感激。

您可以在 base R 中简单地完成此操作。无需使用 mutate

使事情复杂化
for (i in c(2:10)){
  d[[paste0('p_', i)]] = 
    mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s) 
}

请注意,如果您确实想要使用dplyr,那么您可以结合使用!!:=来获得想要的结果。但我发现 base R 更整洁、更简单。

for (i in 2:10){
  d <- d %>% mutate(!!paste0('p_', i) := 
                      mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s))
}