在do
内,我正在调用mutate_
并引用原始数据框。问题是我无法访问mutate
内的数据框。这与lazyeval
包有关,但我无法弄明白。谢谢您的帮助。
例如,假设此函数返回一个data_frame的点。
lattice_points <- function (x0, y0, r){
df <- expand.grid(
x1 = ceiling(x0-r):floor(x0+r),
y1 = ceiling(y0-r):floor(y0+r)) %>%
filter((x1-x0)^2 + (y1-y0)^2 <= r^2)
return (df)
}
然后我创建了另一个函数来序列化这个(我想用id
识别它):
many_lattice_points <- function (df,
id_ = "id", x_ = "x0", y_ = "y0", r_ = "r") {
df_out <- rowwise(df_in) %>%
do( lattice_points(.[x_], .[y_], .[r_])) %>%
mutate_(.dots = interp(~ .[var_], var_ = as.name(id_)))
return (df_out)
}
使用此输入:
> input_df <- data_frame(
id = c("a", "b"), x0 = c(0.5, 5.5),
y0 = c(0.5, 0.5), r = c(1 , 1 ) )
id x0 y0 r
<chr> <dbl> <dbl> <dbl>
1 a 0.5 0.5 1
2 b 5.5 0.5 1
我应该得到以下内容:
id x1 y1
<chr> <dbl> <dbl>
1 a 0.0 0.0
2 a 0.0 1.0
3 a 1.0 0.0
4 a 1.0 1.0
5 b 5.0 0.0
6 b 5.0 1.0
7 b 6.0 0.0
8 b 6.0 1.0
但是,我收到错误,因为找不到列var_
。
澄清:
我找到了其他解决方法,但我想利用do
和lazyeval
的力量。
答案 0 :(得分:0)
使用id
添加do
列的最佳方法是将其包含在group_by
之前。
many_lattice_points <- function (df,
id_ = "id", x_ = "x0", y_ = "y0", r_ = "r") {
df_check <- count_(id_)
if (not(all(data_check$n == 1)))
warning("The function may not work as expected")
df_out <- group_by_(df_in, .dots = id_) %>%
do( lattice_points(.[x_], .[y_], .[r_]) )
return (df_out)
}
虽然如何使用lazyeval
仍然存在问题,但就目的和逻辑而言,这是令人满意的。