So it turns out that there doesn't seem to be a simple way to do this.
I checked out the mailing list entry linked to by baptiste (which is for a single circle) and extended using a for loop to plot each circle one at a time.
df = data.frame(x=c(0.1,0.4,0.6, 0.3, 0.5,0.9), y=c(0.8,0.4,0.2,0.6,0.5,0.1), r=c(0.1,0.2,0.2,0.1,0.2,0.1))
angle <- seq(-pi, pi, length = 50)
myplot = ggplot()
for (i in 1:length(df$x)) {
df_temp = data.frame(x = df$x[i] + df$r[i]*sin(angle), y = df$y[i] + df$r[i]*cos(angle))
myplot = myplot + geom_polygon(data=df_temp, aes(x=x, y=y), inherit.aes=F)
}
myplot = myplot + geom_point(data=df, aes(x=x, y=y))
This gives:

There is a slight change in the example dataset to make things clearer on the plot. I've also plotted the coordinates of the circle centres here.
Edit: suggested improvement, only drawing one polygon layer.
circularise <- function(d, n=360){
angle <- seq(-pi, pi, length = n)
make_circle <- function(x,y,r,id){
data.frame(x=x+r*cos(angle), y=y+r*sin(angle), id)
}
lmat <- mapply(make_circle, id = seq_len(nrow(d)),
x = d[,1], y=d[,2], r=d[,3], SIMPLIFY = FALSE)
do.call(rbind, lmat)
}
circles <- circularise(df)
p = ggplot() +
geom_point(data=df, aes(x=x, y=y))
p + geom_polygon(aes(x,y,group=id, fill=id), data=circles) +
coord_fixed()