1

我的全局环境中有一组空(0-row)和非空(>0-row)Tibbles,我只想选择相关的,即非空的,并将它们发送到write.xlsx命令。

看起来它应该是相当可行的任务,但我很难绕过它。

为简单起见,假设流程中的一些复杂代码会生成小标题 A、B 和 C

library(dplyr)
library(xlsx)
A<-tibble(a=1:3,aa=2:4,aaa=3:5)
B<-tibble(b=rep(1,3),bb=rep(2,3),bbb=rep(3,3))
B<-B %>% filter(b>4)
C<-tibble(c=3:1,bb=4:2,bbb=5:3)
A;B;C

# A tibble: 3 x 3
      a    aa   aaa
  <int> <int> <int>
1     1     2     3
2     2     3     4
3     3     4     5
# A tibble: 0 x 3
# ... with 3 variables: b <dbl>, bb <dbl>, bbb <dbl>
# A tibble: 3 x 3
      c    bb   bbb
  <int> <int> <int>
1     3     4     5
2     2     3     4
3     1     2     3

现在我只想写到 Excel Tibbles A 和 C,因为 B 是空的

所以我尝试了类似的东西

writexlsx<-function(x){
        if("tbl" %in% class(x)){
                if(nrow(x)>0) { 
                        write.xlsx(x,filename=paste(x,".xlsx",sep=""))
                }
        }
}

lapply(writexlsx,ls()) 

但 ls() 只是名称列表,而不是实际对象

ls()
[1] "A"         "B"         "C"         "writexlsx"

有任何想法吗?谢谢你

4

2 回答 2

0

这是一个函数,它获取和写入 XLSX 文件中的所有数据帧,.GlobalRnv或者将作为名称传递的数据帧写入参数中dfnames

writexlsx <- function(dfnames){
  if(missing(dfnames)){
    lst <- mget(ls())
  }else{
    lst <- mget(dfnames)
  }
  lst <- lst[sapply(lst, inherits, "data.frame")]
  lst <- lst[sapply(lst, nrow) > 0]
  lapply(names(lst), function(x){
    write.xlsx(lst[[x]], file = paste0(x, ".xlsx"))
  })
}

writexlsx()
于 2019-11-27T10:44:07.593 回答
0

您可以使用get()字符向量来获取对象:

library(dplyr, warn.conflicts = FALSE)
library(writexl)
A<-tibble(a=1:3,aa=2:4,aaa=3:5)
B<-tibble(b=rep(1,3),bb=rep(2,3),bbb=rep(3,3))
B<-B %>% filter(b>4)
C<-tibble(c=3:1,bb=4:2,bbb=5:3)

get("A")
#> # A tibble: 3 x 3
#>       a    aa   aaa
#>   <int> <int> <int>
#> 1     1     2     3
#> 2     2     3     4
#> 3     3     4     5

writexlsx<-function(x){
  df <- get(x)
  if("tbl" %in% class(df)){
    if(nrow(df)>0) { 
      writexl::write_xlsx(df,path=paste(x,".xlsx",sep=""))
    }
  }
}

lapply(ls(), writexlsx) 
#> [[1]]
#> [1] "A.xlsx"
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> [1] "C.xlsx"
#> 
#> [[4]]
#> NULL

reprex 包(v0.3.0)于 2019-11-27 创建

于 2019-11-27T10:31:23.373 回答