在dplyr中编码的函数中使用函数

在dplyr中编码的函数中使用函数,r,function,debugging,dplyr,R,Function,Debugging,Dplyr,我想在函数中使用一个函数,该函数的列名在dplyr中编码,如下所示,这会引发以下错误: 分组的_df_impl(数据、未命名(vars)、删除)中出错:列Gis 不为人知 代码: # rm(list = ls()) set.seed(12345) Y <- rnorm(10) Env <- paste0("E", rep(1:2, each = 5)) Gen <- paste0("G", rep(1:5, times = 2)) df1 <- data.frame(

我想在函数中使用一个函数,该函数的列名在
dplyr
中编码,如下所示,这会引发以下错误:

分组的_df_impl(数据、未命名(vars)、删除)中出错:列
G
is 不为人知

代码:

# rm(list = ls())

set.seed(12345)
Y  <- rnorm(10)
Env <- paste0("E", rep(1:2, each = 5))
Gen <- paste0("G", rep(1:5, times = 2))
df1 <- data.frame(Y, Env, Gen)

fn1 <- function(.data, .gen, .env, .y){

  Y   <- deparse(substitute(.y))
  G   <- deparse(substitute(.gen))
  E   <- deparse(substitute(.env))

  ge_means <-
    .data %>%
    dplyr::group_by(!!rlang::sym(G), !!rlang::sym(E)) %>%
    dplyr::summarize(Mean = mean(!!rlang::sym(Y)))

  return(list(
    ge_means = ge_means
    ))
}

fn1(
    .data = df1
  , .gen  = Gen
  , .env  = Env
  , .y    = Y
)


fn2 <- function(.data, .gen, .env, .y){

  Y   <- deparse(substitute(.y))
  G   <- deparse(substitute(.gen))
  E   <- deparse(substitute(.env))

  ge_means1 <- 
      fn1(
          .data = .data
        , .gen  = G
        , .env  = E
        , .y    = Y
      )$ge_mean

  return(list(
    ge_means1 = ge_means1
  ))
}


fn2(
    .data = df1
  , .gen  = Gen
  , .env  = Een
  , .y    = Y
)
#rm(list=ls())
种子集(12345)

Y我们可以使用
enquo
代替
deparse/substitute
,然后使用
sym

fn1 <- function(.data, .gen, .env, .y){

  Y   <- enquo(.y)
  G   <- enquo(.gen)
  E   <- enquo(.env)

  ge_means <-
    .data %>%
    dplyr::group_by(!! G, !! E) %>%
    dplyr::summarize(Mean = mean(!! Y))

  return(list(
    ge_means = ge_means
    ))
}

fn1(
    .data = df1
  , .gen  = Gen
  , .env  = Env
  , .y    = Y
)
-输出

#$ge_means
# A tibble: 10 x 3
# Groups: Gen [?]
#   Gen    Env      Mean
#   <fctr> <fctr>  <dbl>
# 1 G1     E1      0.586
# 2 G1     E2     -1.82 
# 3 G2     E1      0.709
# 4 G2     E2      0.630
# 5 G3     E1     -0.109
# 6 G3     E2     -0.276
# 7 G4     E1     -0.453
# 8 G4     E2     -0.284
# 9 G5     E1      0.606
#10 G5     E2     -0.919
#$ge_means1
# A tibble: 10 x 3
# Groups: Gen [?]
#   Gen    Env      Mean
#   <fctr> <fctr>  <dbl>
# 1 G1     E1      0.586
# 2 G1     E2     -1.82 
# 3 G2     E1      0.709
# 4 G2     E2      0.630
# 5 G3     E1     -0.109
# 6 G3     E2     -0.276
# 7 G4     E1     -0.453
# 8 G4     E2     -0.284
# 9 G5     E1      0.606
#10 G5     E2     -0.919
#$ge#u的意思是1
#一个tibble:10x3
#组别:Gen[?]
#Gen环境平均值
#      
#1 G1 E1 0.586
#2 G1 E2-1.82
#3 G2 E1 0.709
#4 G2 E2 0.630
#5 G3 E1-0.109
#6 G3 E2-0.276
#7 G4 E1-0.453
#8G4 E2-0.284
#9 G5 E1 0.606
#10 G5 E2-0.919

我们可以这样使用

fn2 <- function(...) list(ge_means1 = fn1(...)$ge_mean)

fn2(df1, Gen, Env, Y)

fn2请不要发布破坏性命令,如
rm(…)
,这样会破坏读者的工作空间。提醒您,我们希望您不要在所有帖子中添加您将非常感谢的答案。在平常的谈话中,这是一种礼貌,但当它发生时,却恰恰相反。请您以后不要再说了好吗?谢谢您让您最近的问题更加简洁。这是一个明确的改进,并将减少您的职位所需的工作量。我还要提供以下建议:
backtick设备
添加了适合代码、日志、错误和控制台IO的简短示例的内联代码格式。它有一定的语义含义,并不是一个通用的高亮灯。因此,如果你想谈论通用软件、服务和编程语言,它们不需要代码格式,因为它们的名称(Python、Ubuntu、GitHub等)本身不是代码。它们本质上是专有名词,因此只需使用正确的大小写(通常是首字母大写)即可。库处于中间位置,因为它们的名称被输入到包管理器中,因此它们可以被视为IO。但是,如果有疑问,不要添加格式-这会让人困惑,也没有必要。
fn2 <- function(...) list(ge_means1 = fn1(...)$ge_mean)

fn2(df1, Gen, Env, Y)
$ge_means1
# A tibble: 10 x 3
# Groups: Gen [?]
   Gen    Env      Mean
   <fctr> <fctr>  <dbl>
 1 G1     E1      0.586
 2 G1     E2     -1.82 
 3 G2     E1      0.709
 4 G2     E2      0.630
 5 G3     E1     -0.109
 6 G3     E2     -0.276
 7 G4     E1     -0.453
 8 G4     E2     -0.284
 9 G5     E1      0.606
10 G5     E2     -0.919