无法将变量范围限制为R函数中的`standardize :: standardize`

时间:2018-08-13 17:13:24

标签: r lazy-evaluation scoping standardized

我正在尝试创建一个自定义函数,该函数允许我使用standardize包将混合效果标准化应用于大型dplyr数据帧。

尽管使用!!,惰性求值和使用do.call尝试了各种形式的quosure,但我无法将函数参数解析为标函数。

我已经查看了这些线程(12)中的信息,并尝试实现它们。

# example_df

df <- data.frame(
subject = rep( c("01", "02", "03", "04", "05"), 1, each = 5),
time = rep(1:5, 5),
x = rnorm(25, 0, 1) )
library(dplyr)
df <- tbl_df(df) %>% mutate(subject = factor(subject))

library(standardize)

quick_mixed_efx <- function(df, col){
st_x <- standardize(!!col ~ time + 1| subject, data = df)}

quick_mixed_efx(df, x)
  

eval(predvars,data,env)中的错误:找不到对象'x'

另一次尝试(失败):

q_m_efx_2 <- function(df, col){
s_form <- !! col ~ time + 1 | subject
st_x <- do.call("standardize", list(formula = s_form, data = df))
return(st_x) }

q_m_efx2(df, x)给出相同的错误。

理想情况下,我希望能够根据以下功能直接从函数中提取标准化数据:

st_x <- standardize(x ~ time + 1|subject, data = df)

st_x$data$x

在功能之外可以正常工作

我要去哪里错了?

1 个答案:

答案 0 :(得分:0)

!!语法是由rlang包实现的,仅可用于需要该值的函数(例如“ tidyverse”函数中的函数)。这不是处理非标准评估的通用方法。特别是,当前版本的standardize不支持此语法进行变量扩展。因此,您必须使用更传统的方法。

以下是使用substitute()函数重新编写函数的方法

quick_mixed_efx <- function(df, col) {
  form <- substitute(col ~ time + 1| subject)
  standardize(form, data = df)}

quick_mixed_efx(df, x)