将附加的数据框传递给函数
Passing the attached data frame to a function
我正在开发一个函数,它将关于特定变量的信息与关于它来自的数据框的一些基本信息结合起来。这是我正在谈论的示例:
fcn <- function(var,data) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a,df))
这很好用!但是,如果在函数与 with
一起使用或在 dplyr
动词内部使用的情况下,我可以只获取数据 frame/tibble 对象而不显式传递它,那将非常整洁。所以理想情况下像
fcn <- function(var,data=attached_data_object) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a))
我一直在阅读各种环境功能 - 似乎我应该能够进入 with/dplyr 从数据框创建的环境,然后将整个东西全部提取出来。到目前为止,我一直无法弄清楚如何实现这一目标。任何提示表示赞赏!谢谢。
我不确定下面是不是你想要的。
无论如何,您必须将数据集作为您的 first 函数参数。
library(dplyr)
fcn <- function(data, var) {
var <- deparse(substitute(var))
ncol(data)*mean(data[[var]])
}
df <- data.frame(a = 1:10, b = 11:20)
df %>% fcn(a)
#[1] 11
df %>% mutate(c = fcn(., a))
# a b c
#1 1 11 11
#2 2 12 11
#3 3 13 11
#4 4 14 11
#5 5 15 11
#6 6 16 11
#7 7 17 11
#8 8 18 11
#9 9 19 11
#10 10 20 11
df %>% summarise(c = fcn(., a))
# c
#1 11
(如果我用词有误,请向 Hadley 致歉)。您可能会发现 Advanced R 中有关环境和 NSE(non-standard 评估)的章节很有用。
在 dplyr 动词中,例如 mutate,被操纵的 dataframe/tibble 称为“.”。因此“。”在此处的另一个答案中引用数据框。 dplyr 动词会自动查找“.”。对于指定的列名。当您从 mutate() 中调用一个函数时,就像您在这里所做的那样,您想要访问这个名为“.”的对象。存在于函数的执行环境中。那么我们该怎么做呢?
fcn <- function(var) {
dat <- get(".", env=parent.frame())
return(ncol(dat) * mean(var))
}
notacol <- 8
df <- data.frame(a=1:10, b=seq(10, 100, 10))
df
a b
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50
6 6 60
7 7 70
8 8 80
9 9 90
10 10 100
df %>% mutate(c = fcn(a), d = fcn(b), e = fcn(notacol))
a b c d e
1 1 10 11 110 16
2 2 20 11 110 16
3 3 30 11 110 16
4 4 40 11 110 16
5 5 50 11 110 16
6 6 60 11 110 16
7 7 70 11 110 16
8 8 80 11 110 16
9 9 90 11 110 16
10 10 100 11 110 16
我认为这就是您所追求的行为。请注意,notacol
在执行环境中找不到,因为它不在数据框中,但全局环境在搜索路径上,所以它在那里找到。
我正在开发一个函数,它将关于特定变量的信息与关于它来自的数据框的一些基本信息结合起来。这是我正在谈论的示例:
fcn <- function(var,data) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a,df))
这很好用!但是,如果在函数与 with
一起使用或在 dplyr
动词内部使用的情况下,我可以只获取数据 frame/tibble 对象而不显式传递它,那将非常整洁。所以理想情况下像
fcn <- function(var,data=attached_data_object) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a))
我一直在阅读各种环境功能 - 似乎我应该能够进入 with/dplyr 从数据框创建的环境,然后将整个东西全部提取出来。到目前为止,我一直无法弄清楚如何实现这一目标。任何提示表示赞赏!谢谢。
我不确定下面是不是你想要的。
无论如何,您必须将数据集作为您的 first 函数参数。
library(dplyr)
fcn <- function(data, var) {
var <- deparse(substitute(var))
ncol(data)*mean(data[[var]])
}
df <- data.frame(a = 1:10, b = 11:20)
df %>% fcn(a)
#[1] 11
df %>% mutate(c = fcn(., a))
# a b c
#1 1 11 11
#2 2 12 11
#3 3 13 11
#4 4 14 11
#5 5 15 11
#6 6 16 11
#7 7 17 11
#8 8 18 11
#9 9 19 11
#10 10 20 11
df %>% summarise(c = fcn(., a))
# c
#1 11
(如果我用词有误,请向 Hadley 致歉)。您可能会发现 Advanced R 中有关环境和 NSE(non-standard 评估)的章节很有用。
在 dplyr 动词中,例如 mutate,被操纵的 dataframe/tibble 称为“.”。因此“。”在此处的另一个答案中引用数据框。 dplyr 动词会自动查找“.”。对于指定的列名。当您从 mutate() 中调用一个函数时,就像您在这里所做的那样,您想要访问这个名为“.”的对象。存在于函数的执行环境中。那么我们该怎么做呢?
fcn <- function(var) {
dat <- get(".", env=parent.frame())
return(ncol(dat) * mean(var))
}
notacol <- 8
df <- data.frame(a=1:10, b=seq(10, 100, 10))
df
a b
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50
6 6 60
7 7 70
8 8 80
9 9 90
10 10 100
df %>% mutate(c = fcn(a), d = fcn(b), e = fcn(notacol))
a b c d e
1 1 10 11 110 16
2 2 20 11 110 16
3 3 30 11 110 16
4 4 40 11 110 16
5 5 50 11 110 16
6 6 60 11 110 16
7 7 70 11 110 16
8 8 80 11 110 16
9 9 90 11 110 16
10 10 100 11 110 16
我认为这就是您所追求的行为。请注意,notacol
在执行环境中找不到,因为它不在数据框中,但全局环境在搜索路径上,所以它在那里找到。