5

tidyeval (非標準評価) を使用して "lm" の周りに関数を記述しようとしています。ベース R NSE を使用すると、次のように動作します。

lm_poly_raw <- function(df, y, x, degree = 1, ...){
  lm_formula <-
    substitute(expr = y ~ poly(x, degree, raw = TRUE),
               env = list(y = substitute(y),
                          x = substitute(x),
                          degree = degree))
  eval(lm(lm_formula, data = df, ...))
}

lm_poly_raw(mtcars, hp, mpg, degree = 2)

tidyevalただし、 andを使用してこの関数を記述する方法がわかりませんでしたrlangsubstitutebeenquoと eval をに置き換える必要があると思い!!ます。Hadley の Adv-R にいくつかヒントがありますが、私にはわかりませんでした。

4

1 に答える 1

6

以下は、将来 rlang で採用される可能性のある式コンストラクターの種類です。

f <- function(x, y, flatten = TRUE) {
  x <- enquo(x)
  y <- enquo(y)

  # Environments should be the same
  # They could be different if forwarded through dots
  env <- get_env(x)
  stopifnot(identical(env, get_env(y)))

  # Flatten the quosures. This warns the user if nested quosures are
  # found. Those are not supported by functions like lm()
  if (flatten) {
    x <- quo_expr(x, warn = TRUE)
    y <- quo_expr(y, warn = TRUE)
  }

  new_formula(x, y, env = env)
}

# This can be used for unquoting symbols
var <- "cyl"
lm(f(disp, am + (!! sym(var))), data = mtcars)

トリッキーな部分は次のとおりです。

  • の異なるレイヤーを介して転送される場合、LHS と RHS は異なる環境から取得される可能性があり...ます。これを確認する必要があります。

  • ユーザーが引用符を外していないことを確認する必要があります。lm()および co はそれらをサポートしていません。quo_expr()すべてのクォーシュアを平坦化し、いくつかが見つかった場合はオプションで警告します。

于 2017-10-22T08:58:44.277 に答える