gpt4 book ai didi

r - 稍后在管道中访问结果

转载 作者:行者123 更新时间:2023-12-04 14:43:40 25 4
gpt4 key购买 nike

稍后在管道中访问结果

我正在尝试创建在管道中的每个步骤打印数据集中排除的行数的函数。

类似这样的:

iris %>% 
function_which_save_nrows_and_return_the_data() %>%
filter(exclude some rows) %>%
function_which_prints_difference_in_rows_before_after_exlusion_and_returns_data %>%
function_which_save_nrows_and_return_the_data() %>%
function_which_prints_difference_in_rows_before_after_exlusion_and_returns_data ...etc

这些是我尝试过的功能:

n_before = function(x) {assign("rows", nrow(x), .GlobalEnv); return(x)}

n_excluded = function(x) {
print(rows - nrow(x))
return(x)
}

这成功保存了对象行:

enter image description here

但如果我再添加两个链接,则不会保存对象:

enter image description here

那么如何在管道之后创建和访问行对象?

enter image description here

最佳答案

这是由于 R 的惰性求值。即使不使用管道也会发生这种情况。请参阅下面的代码。在该代码中, n_excluded 的参数是 filter(n_before(iris), Species != 'setosa') 并且在这一点 rows 是在 print 语句中使用的参数尚未从 n_excluded 中引用,因此整个参数将不会被评估,因此 rows 还没有存在。

if (exists("rows")) rm(rows)  # ensure rows does not exist
n_excluded(filter(n_before(iris), Species != 'setosa'))
## Error in h(simpleError(msg, call)) :
## error in evaluating the argument 'x' in selecting a method for function
## 'print': object 'rows' not found

解决这个问题

1) 我们可以在 print 语句之前强制 x。

n_excluded = function(x) { 
force(x)
print(rows - nrow(x))
return(x)
}

2) 或者,我们可以使用 magrittr 顺序管道来保证腿按顺序运行。 magrittr 使其可用,但没有为其提供运算符,但我们可以将其分配给这样的运算符。

`%s>%` <- magrittr::pipe_eager_lexical
iris %>%
n_before() %>%
filter(Species != 'setosa') %s>% # note use of %s>% on this line
n_excluded()

magrittr 开发人员表示,如果有足够的需求,他会将其添加为运算符,因此您可能希望将此类请求添加到 magrittr 问题 #247在github上。

关于r - 稍后在管道中访问结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68858736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com