R语言中使用by()调用函数时为何会重复打印数据框?
解决R中
by()函数执行时打印数据框的问题 确实是by()函数导致的控制台打印问题——by()的默认行为是收集每个分组应用自定义函数后的返回结果,并且会在控制台自动打印这个结果集合。如果你的自定义函数没有明确指定返回值,它会返回函数最后执行的表达式的结果(比如你的代码中,当a!=b时返回rbind(Camp3, Slice)的结果,当a==b时返回NULL),这些结果都会被by()收集并打印出来。
你可以通过以下两种方式解决这个问题:
方法1:让自定义函数返回不可见的NULL
在你的自定义函数最后添加invisible(NULL),强制函数返回一个不会被控制台自动打印的不可见值:
my_func <- function(Slice){ a <- nrow(Slice) b <- nrow(Slice[!is.na(Slice$Désinscription),]) if(a!=b){ Camp3 <<- rbind(Camp3, Slice) } invisible(NULL) # 新增这一行,抑制返回值的打印 } by(Camp2,Camp2$Type, my_func)
对应iris测试示例的修改:
my_func <- function(x){ invisible(NULL) } by(iris,iris$Species, my_func)
方法2:用invisible()包裹by()的调用
如果不想修改自定义函数,可以直接把整个by()调用放在invisible()中,让by()的返回值不被打印:
invisible(by(Camp2,Camp2$Type, my_func))
额外建议
尽量避免使用<<-进行全局变量赋值,这种方式会让代码的可读性和可维护性下降。你可以考虑将Camp3作为参数传入函数,或者用dplyr等包的分组操作来实现类似逻辑(比如group_by() + filter() + bind_rows()),代码会更清晰。
内容的提问来源于stack exchange,提问作者Frédéric Côté
相关产品推荐
相关产品推荐

