Turning my comment to an answer, the sm package offers non-parametric ANCOVA as sm.ancova
. Here is a toy example:
data(anorexia, package="MASS")
anorexia$Treat <- relevel(anorexia$Treat , ref="Cont")
# visual check for the parallel group assumption
xyplot(Postwt ~ Prewt, data=anorexia, groups=Treat, aspect="iso", type=c("p","r"),
auto.key=list(space="right", lines=TRUE, points=FALSE))
# fit two nested models (equal and varying slopes across groups)
anorex.aov0 <- aov(Postwt ~ Prewt + Treat, data=anorexia) # ≈ lm(Postwt ~ Prewt + Treat + offset(Prewt), data=anorexia)
anorex.aov1 <- aov(Postwt ~ Prewt * Treat, data=anorexia)
# check if we need the interaction term
anova(anorex.aov0, anorex.aov1)
summary.lm(anorex.aov1)

The above shows that the parallel group assumption is not realistic and that we must account for the interaction (p=0.007) between the factor group and continuous covariate.
Here is what we would get with sm.ancova
, with default smoothing parameter and equal-group as the reference model:
> with(anorexia, ancova.np <- sm.ancova(Prewt, Postwt, Treat, model="equal"))
Test of equality : h = 1.90502 p-value = 0.0036
Band available only to compare two groups.

There is another R package for non-parametric ANCOVA (I haven't tested it, though): fANCOVA, with T.aov
allowing to test for the equality of nonparametric curves or surfaces based on an ANOVA-type statistic.
sm.ancova
). $\endgroup$sm
is (I think) addressing smoothing (where 'nonparametric' refers to the form of the relationship between y and a continuous covariate). These are different things. See items 1. vs 2. in the introductory section of the relevant wikipedia page. Such confusion of terminology causes endless problems! $\endgroup$