我将我的编码转换为管道使用,遇到了困难。在当前的例子中,我有一个 Dataframe df
,它以某种方式被处理,然后一个函数被应用到结果 Dataframe 。大概是这样的:
library(magrittr)
# Create data.
df <- data.frame(a=1:10, b= -10:-1)
# Process data.
df %>%
{.$c <- rowSums(.); .} %>%
# Keep only relevant rows
.[.$c > 11, , drop= FALSE] %>%
# Go on if there are rows left...
if(nrow(.) > 0){
print("here is my code")
} else{
print("here is my code b")
}
字符串
运行这个得到Error in if (.) nrow(.) > 0 else { : the condition has length > 1
。这里,我想我的代码B关闭。如何调整代码使其工作?
编辑
总结一下答案:不建议在if(...){...}
中使用管道,如果您仍然这样做,您的代码将变得笨拙。对我来说,这指向了管道的局限性。
3条答案
按热度按时间snz8szmq1#
可以像这样使用
if
字符串
或者稍微有点黑客味
型
xdnvmnnf2#
不要将数据的子集通过管道传输到if语句。创建一个新的data.frame并将其传递给if语句
字符串
nlejzf6q3#
您可以通过使用额外的
{}
Package 来修复代码,这将强制显式使用点字符串
它能正常工作的原因是
if
是一个3参数函数,它接收条件、yes操作和no操作(后面的参数被忽略)在这里,您向第一个参数中插入了一个点,因此它尝试运行的代码是
if(.) nrow(.)>0 else print("here is my code")
,其中.
是前面步骤的输出(一个 Dataframe ,而不是布尔值)这是非常奇怪的代码,一个惯用的管道调用看起来更像(仍然使用奇怪的管道if,以避免创建临时变量):
型
使用tidyverse的第一步是:
型
如果您想保留语法,但不想用临时变量填充环境,可以使用
local()
型
通常,如果你有复杂的代码,创建了很多变量,你应该使用足够简单的函数,这样它们的执行环境就不会包含那么多的变量,所以你不需要
local()
来做家务。