【发布时间】:2020-09-07 02:23:53
【问题描述】:
我使用safely 来捕捉我发出呼噜声时代码中出现的错误。但是,safely 的结果比我预期的要复杂得多。
首先我们创建必要的函数和示例数据。
#base functions.
SI_tall <- function(topheight, age, si ){
paramasi <- 25
parambeta <- 7395.6
paramb2 <- -1.7829
refAge <- 100
d <- parambeta*(paramasi^paramb2)
r <- (((topheight-d)^2)+(4*parambeta*topheight*(age^paramb2)))^0.5
## height at reference age
h2 <- (topheight+d+r)/ (2+(4*parambeta*(refAge^paramb2)) / (topheight-d+r))
return(abs(h2 - si))
}
new.topheight <- function(my.si, my.age){
optim(par = list(topheight = 10), ## this topheight is just an initial value
method = 'L-BFGS-B', fn = SI_tall, si = my.si, age = my.age, lower= 0, upper=100)$par
}
#Creating the function which will display errors.
safe_new.topheight <- safely(new.topheight)
#Creating data
my.age <- seq(0,100, by=0.2)
my.si <- c(15)
si.crossing <- tidyr::crossing(my.si, my.age) %>% data.frame()
#Creating the column to be unnested.
si.crossing2<- si.crossing %>%
mutate(height=map2(my.si,my.age, safe_new.topheight))
但是,结果对我来说变得很复杂,我什至不知道“高度”列中的列表嵌套有多远。这是我数据中前 5 行的数据:
structure(list(my.si = c(15, 15, 15, 15, 15), my.age = c(0, 0.2,
0.4, 0.6, 0.8), height = list(list(result = NULL, error = structure(list(
message = "L-BFGS-B needs finite values of 'fn'", call = optim(par = list(topheight = 10),
method = "L-BFGS-B", fn = SI_tall, si = my.si, age = my.age,
lower = 0, upper = 100)), class = c("simpleError", "error",
"condition"))), list(result = c(topheight = 0.000693170450744849),
error = NULL), list(result = c(topheight = 0.00205917508142004),
error = NULL), list(result = c(topheight = 0.00390099534708239),
error = NULL), list(result = c(topheight = 0.00639475141226834),
error = NULL))), row.names = c(NA, 5L), class = "data.frame")
有什么办法可以将其展平为列:
my.si , my.age , topheight, 错误。
非常感谢!
【问题讨论】:
标签: r dplyr tidyr tibble unnest