title: Strategies for formatting JSON output from R
body: <p>I'm trying to figure out the best way of producing a JSON file from R. I have the following dataframe <code>tmp</code> in <code>R</code>. </p>
  
  <pre><code>&gt; tmp
    gender age welcoming proud tidy unique
  1      1  30         4     4    4      4
  2      2  34         4     2    4      4
  3      1  34         5     3    4      5
  4      2  33         2     3    2      4
  5      2  28         4     3    4      4
  6      2  26         3     2    4      3
  </code></pre>
  
  <p>The output of <code>dput(tmp)</code> is as follows:</p>
  
  <pre><code>tmp &lt;- structure(list(gender = c(1L, 2L, 1L, 2L, 2L, 2L), age = c(30, 
  34, 34, 33, 28, 26), welcoming = c(4L, 4L, 5L, 2L, 4L, 3L), proud = c(4L, 
  2L, 3L, 3L, 3L, 2L), tidy = c(4L, 4L, 4L, 2L, 4L, 4L), unique = c(4L, 
  4L, 5L, 4L, 4L, 3L)), .Names = c("gender", "age", "welcoming", 
  "proud", "tidy", "unique"), na.action = structure(c(15L, 39L, 
  60L, 77L, 88L, 128L, 132L, 172L, 272L, 304L, 305L, 317L, 328L, 
  409L, 447L, 512L, 527L, 605L, 618L, 657L, 665L, 670L, 708L, 709L, 
  729L, 746L, 795L, 803L, 826L, 855L, 898L, 911L, 957L, 967L, 983L, 
  984L, 988L, 1006L, 1161L, 1162L, 1224L, 1245L, 1256L, 1257L, 
  1307L, 1374L, 1379L, 1386L, 1387L, 1394L, 1401L, 1408L, 1434L, 
  1446L, 1509L, 1556L, 1650L, 1717L, 1760L, 1782L, 1814L, 1847L, 
  1863L, 1909L, 1930L, 1971L, 2004L, 2022L, 2055L, 2060L, 2065L, 
  2082L, 2109L, 2121L, 2145L, 2158L, 2159L, 2226L, 2227L, 2281L
  ), .Names = c("15", "39", "60", "77", "88", "128", "132", "172", 
  "272", "304", "305", "317", "328", "409", "447", "512", "527", 
  "605", "618", "657", "665", "670", "708", "709", "729", "746", 
  "795", "803", "826", "855", "898", "911", "957", "967", "983", 
  "984", "988", "1006", "1161", "1162", "1224", "1245", "1256", 
  "1257", "1307", "1374", "1379", "1386", "1387", "1394", "1401", 
  "1408", "1434", "1446", "1509", "1556", "1650", "1717", "1760", 
  "1782", "1814", "1847", "1863", "1909", "1930", "1971", "2004", 
  "2022", "2055", "2060", "2065", "2082", "2109", "2121", "2145", 
  "2158", "2159", "2226", "2227", "2281"), class = "omit"), row.names = c(NA, 
  6L), class = "data.frame")
  </code></pre>
  
  <p>Using the <code>rjson</code> package, I run the line <code>toJSON(tmp)</code> which produces the following JSON file:</p>
  
  <pre><code> {"gender":[1,2,1,2,2,2],
   "age":[30,34,34,33,28,26],
   "welcoming":[4,4,5,2,4,3],
   "proud":[4,2,3,3,3,2],
    "tidy":[4,4,4,2,4,4],
    "unique":[4,4,5,4,4,3]}
  </code></pre>
  
  <p>I also experimented with the <code>RJSONIO</code> package; the output of <code>toJSON()</code> was the same. What I would like to produce is the following structure:</p>
  
  <pre><code>  {"traits":["gender","age","welcoming","proud", "tidy", "unique"],
     "values":[   
              {"gender":1,"age":30,"welcoming":4,"proud":4,"tidy":4, "unique":4},
              {"gender":2,"age":34,"welcoming":4,"proud":2,"tidy":4, "unique":4},
              ....
              ]
  </code></pre>
  
  <p>I'm not sure how best to do this. I realize that I can parse it line by line using <code>python</code> but I feel like there is probably a better way of doing this. I also realize that my data structure in <code>R</code> does not reflect the meta-information desired in my <code>JSON</code> file (specifically the <code>traits</code> line), but I am mainly interested in producing the data formatted like the line </p>
  
  <pre><code>{"gender":1,"age":30,"welcoming":4,"proud":4,"tidy":4, "unique":4}
  </code></pre>
  
  <p>as I can manually add the first line. </p>
  
  <hr>
  
  <p>EDIT: I found a useful <a href="http://theweiluo.wordpress.com/2011/09/30/r-to-json-for-d3-js-and-protovis/trackback/" rel="noreferrer">blog</a> post where the author dealt with a similar problem and provided a solution. This function produces a formatted JSON file from a data frame.</p>
  
  <pre><code>toJSONarray &lt;- function(dtf){
  clnms &lt;- colnames(dtf)
  
  name.value &lt;- function(i){
  quote &lt;- '';
  # if(class(dtf[, i])!='numeric'){
  if(class(dtf[, i])!='numeric' &amp;&amp; class(dtf[, i])!= 'integer'){ # I modified this line so integers are also not enclosed in quotes
  quote &lt;- '"';
  }
  
  paste('"', i, '" : ', quote, dtf[,i], quote, sep='')
  }
  
  objs &lt;- apply(sapply(clnms, name.value), 1, function(x){paste(x, collapse=', ')})
  objs &lt;- paste('{', objs, '}')
  
  # res &lt;- paste('[', paste(objs, collapse=', '), ']')
  res &lt;- paste('[', paste(objs, collapse=',\n'), ']') # added newline for formatting output
  
  return(res)
  }
  </code></pre>