Any specific reason you don't want to use type="o" ? This is the easiest way to get the desired effect:
# Fake data set.seed(10) dfs = data.frame(x=1:10, y=rnorm(10)) plot(y~x,data=dfs, type="o", pch=21, bg='white')
pch=21 is a circle marker, such as pch=1 , but with a border and padding. We set the fill to white using bg="white" to "cover" the lines passing through the point markers.

You can also use cex to resize the marker to avoid matching and make visible the lines between adjacent points:
set.seed(10) dfs = data.frame(x=1:100, y=cumsum(rnorm(100))) plot(y~x,data=dfs, type="o", pch=21, bg="white", cex=0.6)

source share