Как упомянуто в предупреждающем сообщении swc.fxn
может обрабатывать только один ввод.
swc.fxn(df1[1, ])
Это работает, но если вы пропустите все строки, это не сработает.Один из способов - использовать Map
, чтобы он работал для нескольких строк одновременно, и использовать от lapply
до expand
каждого кадра данных.
swc.fxn <-function(df1){
box<-pythag.opp.leg(df1$Radius)
box<-round(box)
Xhigh<-df1$X+box
Xlow<-df1$X-box
Yhigh<-df1$Y+box
Ylow<-df1$Y-box
swc.box<- Map(function(a, b, c, d, e) data.frame(X = a:b, Y = c:d, Z = e),
Xlow, Xhigh, Ylow, Yhigh, df1$Z)
swc.box2<- lapply(swc.box, function(x) tidyr::expand(x, X, Y, Z))
return(swc.box2)
}
, который затем вернет вам фрейм данных для каждой строки
swc.fxn(df1)
#[[1]]
# A tibble: 25 x 3
# X Y Z
# <int> <int> <dbl>
# 1 98 88 10
# 2 98 89 10
# 3 98 90 10
# 4 98 91 10
# 5 98 92 10
# 6 99 88 10
# 7 99 89 10
# 8 99 90 10
# 9 99 91 10
#10 99 92 10
# … with 15 more rows
#[[2]]
# A tibble: 25 x 3
# X Y Z
# <int> <int> <dbl>
# 1 108 88 10
# 2 108 89 10
# 3 108 90 10
# 4 108 91 10
# 5 108 92 10
# 6 109 88 10
# 7 109 89 10
# 8 109 90 10
# 9 109 91 10
#10 109 92 10
# … with 15 more rows
#.....
#.....
Если конечная цель состоит в том, чтобы превратить это в один фрейм данных, мы можем использовать do.call(rbind...
с lapply
или используйте purrr::map_df
.Краткая версия функции может быть
swc.fxn <-function(df1){
box<- round(pythag.opp.leg(df1$Radius))
swc.box<- Map(function(a, b, c, d, e) data.frame(X = a:b, Y = c:d, Z = e),
df1$X-box, df1$X+box, df1$Y-box, df1$Y+box, df1$Z)
swc.box2<- purrr::map_df(swc.box, function(x) tidyr::expand(x, X, Y, Z))
return(swc.box2)
}