This boils down to a timing issue.
Initially the p has display:none; and opacity:0;. On hover the p has
display:block; and opacity:1;, and then, after the delay, this is
reset to display:none; and opacity:0; when the animation starts.
By setting the hover p to have display:block; and animating only the
opacity, then I almost get the desired result. To stop the animation
from completing and setti

Here is a method slightly different that yours (but only slightly).
Inspection of switzerland@data reveals that, while there are 11
FeatureIDs (representing ethnicitity's), there are only 4 unique named
ethnicity's (German, Italian, and French Swiss, and Rhaetoromanians).
So the result below is based on the names, not the IDs.
library(rgeos) # for gIntersection(...), etc.
library(rgdal) #