无法将变量范围限定为“标准化::标准化”的 R 函数
Unable to scope variables into R functions for `standardize::standardize`
我正在尝试创建一个自定义函数,允许我使用 standardize
包将混合效果标准化应用于大型 dplyr 数据框。
尽管尝试了各种形式的 quosure、使用 !!
、惰性求值和使用 do.call
,但我未能将函数参数解析为标准化函数。
我已经查看了这些主题 (, ) 中的信息并尝试实施它们。
# 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)
Error in eval(predvars, data, env) : object 'x' not found
另一次(失败)尝试:
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
在函数之外工作正常
我哪里错了?
!!
语法由 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)
我正在尝试创建一个自定义函数,允许我使用 standardize
包将混合效果标准化应用于大型 dplyr 数据框。
尽管尝试了各种形式的 quosure、使用 !!
、惰性求值和使用 do.call
,但我未能将函数参数解析为标准化函数。
我已经查看了这些主题 (
# 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)
Error in eval(predvars, data, env) : object 'x' not found
另一次(失败)尝试:
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
在函数之外工作正常
我哪里错了?
!!
语法由 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)