R - write.table与变量/内存输出?

时间:2011-05-12 18:13:45

标签: r

我想使用write.table,除了我希望“输出”是内存中的变量而不是磁盘上的文件。基本上我正在尝试获取data.frame的字符串表示(列对齐,没有列标题)。

3 个答案:

答案 0 :(得分:4)

使用capture.output获取print的输出:

df.mem=capture.output(print(df, row.names=FALSE))
df.mem

[1] "   A   B   C" " 500   1  92" "  12  13 754" "   8 938   3"

答案 1 :(得分:3)

您可以写入任何连接,而不是写入文件。

我可以这样做:

x = matrix(rnorm(100), ncol = 10)

write.table(file = pipe("pbcopy"), x)

将表写入剪贴板。

然后我可以用

重读它
read.table(pipe("pbpaste"))

编辑:

您也可以将所有内容都舍入为固定位数,然后在(write.table调用)中使用sep =“”,如下所示:

x = matrix(rnorm(100), ncol = 10)

write.table(file = pipe("pbcopy"), round(x, 2), sep = "    ")

readLines(pipe("pbpaste"))

结果

 [1] "      V1    V2    V3    V4    V5    V6    V7    V8    V9   V10"
 [2] "1  -0.73  0.10 -0.47  1.02 -0.13 -0.01 -1.00 -0.19 -1.10  0.29"
 [3] "2  -0.53 -0.29  0.60  1.41  2.09 -0.49 -2.48  0.17  0.88  1.53"
 [4] "3   1.16  0.28  0.40  0.36  0.16  0.03 -0.72  0.20  1.71 -1.10"
 [5] "4   0.63 -0.85 -0.23 -0.95  0.09  0.96  0.31 -0.05  1.07 -0.09"
 [6] "5  -1.15 -0.27  0.80  0.62 -0.77 -0.54  0.18 -0.16  0.27 -0.17"
 [7] "6   1.03 -2.19  1.54 -1.36  1.00  0.35 -0.84 -0.54 -0.33 -0.92"
 [8] "7   0.12  0.49 -2.03 -0.07  0.55  0.48  0.32  0.22 -0.44 -0.56"
 [9] "8  -0.13 -0.07 -0.28 -0.49  1.56 -2.00 -0.44 -0.04 -0.26  0.77"
[10] "9  -1.23 -0.53  0.57  0.08 -0.59  0.65 -0.15  0.44 -0.67  0.00"
[11] "10 -0.60  1.07 -1.82  0.39  1.11 -1.86  0.25  0.44  0.57  0.53"

答案 2 :(得分:0)

我认为这很有效。任何批评?我现在还在加速。

PrettyPrintDataFrame = function( toPrint , separator = "" , align = "left" )
{        
    leftAlign = FALSE
    if ( align == "left" ) 
    {
        leftAlign = TRUE        
    }
    else if ( align == "right" )  {  }
    else
    {
        stop( "align must be 'left' or 'right'" )
    }

    result = ""
    numberOfColumns = ncol( toPrint )
    columnLenghts = array( dim = numberOfColumns )         
    for ( i in seq( 1:numberOfColumns ) )
    {
        columnLenghts[ i ] = max( nchar( toPrint[ , i ] ) )
    }

    numberOfRows = nrow( toPrint )    
    for ( row in seq( 1:numberOfRows ) )
    {   
        if ( row > 1 )
        {
            result = paste( result , "\n" , sep = "" )
        }

        for ( col in seq( 1:numberOfColumns ) )
        {
            value = toPrint[ row , col ]
            valuePadding = paste( rep( " " , columnLenghts[ col ]- nchar( value ) ) , collapse = "" , sep = "" )

            if ( leftAlign )
            {
                valuePadded = paste( value , valuePadding , sep = "" )
            }
            else
            {
                valuePadded = paste( valuePadding , value , sep = "" )
            }

            if ( col == 1 )
            {
                result = paste( result , valuePadded , sep = "" )
            }
            else            
            {
                result = paste( result , valuePadded , sep = separator )
            }

        }        
    }

    return( result )

}

测试

df = data.frame( A = c( 500 , 12 , 8 ) , B = c( 1 , 13 , 938 ) , C = c( 92, 754 , 3 ) )
writeLines( PrettyPrintDataFrame( df , " | " ) )