r语言 - 数据帧中带有"eval_tidy()"的行数



>我正在尝试在整洁的评估框架中获取data参数的行数。有什么建议我应该在quo()函数中放入什么,让表达式计算到数据的行数?我知道.data代词实际上不是data.frame,解决方案不需要使用它。

在下面的示例中,我希望q计算结果为nrow(my_data),在下面的示例中应该是 20。

library(rlang)
my_data <- data.frame(x = rnorm(20))
# Doesn't work
q <- quo(nrow(.data))
eval_tidy(q, my_data)
#> NULL
# Doesn't work
q <- quo(length(.data[[1]]))
eval_tidy(q, my_data)
#> Error: Must subset the data pronoun with a string.
# Works but requires prior knowledge of data
q <- quo(length(.data[["x"]]))
eval_tidy(q, my_data)
#> [1] 20

创建于 2021-12-20 由 reprex 软件包 (v2.0.1)

理想情况下,这应该适用于任何维度的data.frame,包括 0 行或 0 列的维度。

编辑:澄清一下,我无法控制整洁的评估本身,这就是为什么我正在寻找一种修改quo()函数内部内容的解决方案。不过,整洁评估的数据部分保证是一个数据帧。

一种解决方案是在quo()捕获的未计算表达式中使用预先指定的变量名称,然后在计算中将数据框分配给该变量名称:

myquo <- quo(nrow(.df))              # Choosing .df as my variable name
eval_tidy(myquo, list(.df=my_data))  # Assigning my_data to that variable name
# [1] 20
# Works with empty data frames
data0 <- data.frame()
eval_tidy(myquo, list(.df=data0))
# [1] 0

编辑:为了解决您的注释,从表达式中访问数据框是很棘手的,因为正在计算表达式的环境不知道它。因此,您必须逐步浏览环境,直到到达调用eval_tidy()的位置,即数据框所在的位置。

下面是一个具有代表性的示例:

myquo <- quo(
environment() %>%             # The quosure itself
rlang::env_parent() %>%     # The data frame, x is defined here
rlang::env_parent() %>%     # The calling env of eval_tidy(), which 
#    knows of the quosure and the data frame
ls()
)
eval_tidy(myquo, my_data)
# [1] "my_data" "myquo"

因此,如果您无法修改eval_tidy()表达式,但您确定数据变量的名称(在本例中my_data),则可以直接在调用环境中访问它:

myquo <- quo(
nrow(get("my_data"))
)
eval_tidy(myquo, my_data)
# [1] 20

在这里,get()将沿着调用堆栈向上走,直到找到具有适当名称的变量,因此可能需要格外小心以避免名称冲突。

最新更新