Here is some code that demonstrates:
png('test.png', type="quartz", antialias="none")
curve(sin, 0, 10)
dev.off()
The output is still antialiased.
The problem seems to be within the png() function, in these lines:
antialias <- match(d$antialias, aa.cairo)
if (type == "quartz" && capabilities("aqua")) {
width <- g$width/ifelse(is.na(res), 72, res)
height <- g$height/ifelse(is.na(res), 72, res)
invisible(.External(CQuartz, "png", path.expand(filename),
width, height, pointsize, d$family, antialias !=
"none", TRUE, "", bg, "white", if (is.na(res)) NULL else res))
}
At the start of this, d$antialias is "none". The first line sets antialias to the number 2. Then the external CQuartz function is called and compares antialias (which is a number) to "none".
I think the solution is to replace the antialias!="none" with d$antialias!="none".