

    b.toAdd <- setdiff (names(a), names(b))
    if (length(b.toAdd))
      b[, b.toAdd] <- NA

    a.toAdd <- setdiff (names(b), names(a))
    if (length(a.toAdd))
      a[, a.toAdd] <- NA

    rbind(a, b)


----

b = data.frame(Pears=c(1,2,3),Oranges=c(4,6,6))
a = data.frame(Pears=c(1,2,3),Apples=c(3,2,1),Oranges=c(4,6,6))


## Update: 
Just noticed your comment about needing memory efficiency. 
In that case, you probably want to use `data.table` since using `<-` will create unnecessary copies.   
`data.table` isntead has a `:=` operator which is significantly more efficient. 


    library(data.table)
    a <- data.table(a)
    b <- data.table(b)


    if (length(b.toAdd <- setdiff (names(a), names(b))))
        b[, c(b.toAdd) := NA]

    if (length(a.toAdd <- setdiff (names(b), names(a))))
        a[, c(a.toAdd) := NA]

    rbind(a, b, use.names=TRUE)

    #    Pears Apples Oranges
    # 1:     1      3       4
    # 2:     2      2       6
    # 3:     3      1       6
    # 4:     1     NA       4
    # 5:     2     NA       6
    # 6:     3     NA       6

search SO for `[r] [data.table] benchmarks` to get an idea of the improvements
