пользовательские функции внутри вложенных для циклов - PullRequest
0 голосов
/ 23 сентября 2019

Я бы хотел сгенерировать список data.frames внутри вложенных циклов, аналогичных этому вопросу .Во втором цикле j должно быть 4, затем 5, но он работает только как 5. Ошибка в моей функции или в том, как я использую вложенные циклы?

df=data.frame(Value=c(11,4,6,10,7,2)) 

exceedance_fun= function(x,y){ 
z=case_when(
  x > y ~ "No",
  x <= y ~ paste(y,"mg/L"),
  TRUE ~ "unsure"
)
return(z)
}  

datalist = list()

for (i in 1:2) {
for (j in 4:5) {
dat=df %>%
mutate(Vio= exceedance_fun(Value,j))
dat$i <- i
datalist[[i]] <- dat 
}
}

Неверный вывод

[[1]]
Value    Vio i
1    11     No 1
2     4 5 mg/L 1  #This should be 4 mg/L
3     5 5 mg/L 1  #This should be 4 mg/L
4    10     No 1
5     7     No 1
6     2 5 mg/L 1  #This should be 4 mg/L

[[2]]
Value    Vio i
1    11     No 2
2     4 5 mg/L 2
3     5 5 mg/L 2
4    10     No 2
5     7     No 2
6     2 5 mg/L 2

1 Ответ

1 голос
/ 23 сентября 2019

Вот как я бы рекомендовал реструктуризацию в общем случае, когда вы существенно меняете несколько параметров:

params = expand.grid(i = 1:2, j = 4:5)
datalist = list()

for (k in 1:nrow(params)) {
  datalist[[k]] = df %>%
    mutate(Vio= exceedance_fun(Value,param$j[k]),
           i = params$i[k])
}

Я бы также рекомендовал использовать более описательные имена переменных, чем i и j, ноЯ не могу сказать, что это такое.


Однако в этом случае i на самом деле не делает ничего, так что цикл for, вероятно, подойдет:

j_vals = 4:5
datalist = list()

for (i in seq_along(j_vals)) {
  datalist[[i]] = df %>%
    mutate(Vio= exceedance_fun(Value, j_vals[i]),
           i = i)
}

Хотя может показаться, что было бы более полезно записать j, чем i ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...