如何在 R 中使用 apply + cat 并获得可变宽度的结果

  • 本文关键字:结果 cat apply r string
  • 更新时间 :
  • 英文 :


我正在尝试使用R以自定义方式打印一些数据,以便在单独的程序中使用。它一直试图留下我的号码,我无法完全停止它。我无法找到任何格式,打印,猫等来完全解决我的问题。此外,搜索固定宽度或可变宽度会导致人们希望解决一些不同的问题(并且大多数人希望改变填充样式 - 而不是删除它(。

进行以下数据设置:

> df.play <- data.frame(name = c('a','b','c'), value = c(1,11,111))
> df.play
  name value
1    a     1
2    b    11
3    c   111

这是我想要的输出

#Goal
> for (j in seq(nrow(df.play))) {cat(as.character(df.play[j,1]),'.',df.play[j,2],'n',sep='')}
a.1
b.11
c.111

如何在不显式循环的情况下获取此输出格式(最好避免使用外部库(?

#Naive Attempt 1
#    Why does it left pad the second "column"?
#    How do I get it to stop?
#    Why does cat even parse it as a column to begin with?
junk<-apply(df.play,1,function(x) cat(x[1],'.',x[2],'n',sep=''))
a.  1
b. 11
c.111
#Naive Attempt 2
#    Perhaps this will help provide some insight.
#    The number is a string before it gets to cat. Why?
t<-apply(df.play,1,function(x) cat(x[1],'.',sprintf('%d',x[2]),'n',sep=''))
 Error in sprintf("%d", x[2]) : 
  invalid format '%d'; use format %s for character objects 

也许这会做到:

cat(do.call(paste, c(df.play, list(sep = '.'))), sep = 'n')
# a.1
# b.11
# c.111

此外,按行apply将给出固定的结果,因为format在将data.frame转换为具有as.matrix的矩阵时会增加额外的间距(请参阅这篇文章(。

您可以使用

sprintf,但不确定您是否想要sprintf解决方案,您只需要在字符总数之前放置"-"符号即可左对齐,如下所示:

data.frame(value=sprintf("%-5s",paste0(df.play$name,".",df.play$value)))

或者带有 gsub 的 BaseR 解决方案:

df <- data.frame(value =gsub("\s+","",apply(df.play,1,paste0,collapse=".")))
data.frame(value1=sprintf("%-5s",df$value))

或者,如果您不想粘贴0,那么我们也可以团结起来,

df <- tidyr::unite(df.play,value,1:2,sep=".")
data.frame(value1=sprintf("%-5s",df$value))

输出

value
1 a.1  
2 b.11 
3 c.111

最新更新