Here is one alternative formulation.
First a useful function:
tvseq <- function(...)t(Vectorize(seq.default)(...))
Now for interpolation:
years <- as.numeric(gsub("y","",names(my.data)))
d <- diff(years)
L <- lapply(seq(d), function(i) tvseq(from=my.data[,i], to=my.data[,i+1], length.out=d[i]+1)[,-1])
result <- cbind(my.data[,1], do.call(cbind, L))
colnames(result) <- paste0("y",min(years):max(years))
Result:
> result
y1980 y1981 y1982 y1983 y1984 y1985 y1986 y1987 y1988 y1989 y1990
[1,] 0.1 0.12 0.14 0.16 0.18 0.2 0.24 0.28 0.32 0.36 0.4
[2,] 1.0 1.20 1.40 1.60 1.80 2.0 2.40 2.80 3.20 3.60 4.0
[3,] 10.0 12.00 14.00 16.00 18.00 20.0 24.00 28.00 32.00 36.00 40.0
To add extrapolation, use this:
ylow <- 1978:(min(years)-1)
low <- tvseq(to=result[,1], by=result[,2]-result[,1], length.out=length(ylow)+1)[,1:length(ylow)]
colnames(low) <- paste0("y",ylow)
yhigh <- (max(years)+1):1992
high <- tvseq(from=result[,ncol(result)], by=result[,ncol(result)]-result[,ncol(result)-1], length.out=length(yhigh)+1)[,-1]
colnames(high) <- paste0("y",yhigh)
cbind(low, result, high)
Result:
y1978 y1979 y1980 y1981 y1982 y1983 y1984 y1985 y1986 y1987 y1988 y1989 y1990 y1991 y1992
[1,] 0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.2 0.24 0.28 0.32 0.36 0.4 0.44 0.48
[2,] 0.60 0.80 1.0 1.20 1.40 1.60 1.80 2.0 2.40 2.80 3.20 3.60 4.0 4.40 4.80
[3,] 6.00 8.00 10.0 12.00 14.00 16.00 18.00 20.0 24.00 28.00 32.00 36.00 40.0 44.00 48.00