在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