0

在内部,domutate_参考原始数据框调用 a 。问题是我无法访问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_

澄清:我找到了其他方法来解决它,但我想利用dowith的力量lazyeval

4

1 回答 1

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,但这在目的和逻辑上是令人满意的。

于 2017-05-23T15:37:25.233 回答