Ну хорошо. Я принял это как вызов.
Очевидно, вам нужно:
require(rgl)
require(car)
require(mgcv) # for the example
Скопируйте код car:::scatter3d.default
и вставьте его обратно, присвоив ему scatter3d.default
.
Добавьте эти строки в начале кода для scatter3d.default
:
showLabels3d <- car:::showLabels3d
nice <- car:::nice
# since you will be losing their connection to the unexposed fns in car
Затем в блоке кода, следующем за вторым if(axis.scales){ ...}
, подставьте этот код:
if (axis.scales) {
x.labels <- seq(lab.min.x, lab.max.x,
by=diff(range(lab.min.x, lab.max.x))/4)
x.at <- seq(min.x, max.x, by=nice(diff(range(min.x, max.x))/4))
rgl.texts(x.at, -0.05, 0, x.labels, col = axis.col[1])
z.labels <- seq(lab.min.z, lab.max.z,
by=diff(range(lab.min.z, lab.max.z))/4)
z.at <- seq(min.z, max.z, by=diff(range(min.z, max.z))/4)
rgl.texts(0, -0.1, z.at, z.labels, col = axis.col[3])
y.labels <- seq(lab.min.y, lab.max.y,
by=diff(range(lab.min.y, lab.max.y))/4)
y.at <- seq(min.y, max.y, by=diff(range(min.y, max.y))/4)
rgl.texts(-0.05, y.at, -0.05, y.labels, col = axis.col[2])
}
(Возможно, вам придется заменить код для scatter3d.formula
, чтобы он не заглядывал в car
NAMESPACE для обычно отправляемого метода scatter
. Я просто заменил вызов scatter3d
внутри car:::scatter3d.formula
на " scatter3d.default ", чтобы интерпретатор сначала посмотрел на вновь определенную функцию.)
Редактировать: лучший способ, чем перебирать с помощью scatter3d.formula
, - назначить пространство имен / окружение car
новой функции с помощью этого кода:
environment(scatter3d.default) <- environment(car:::scatter3d.formula)
Тогда, если вы сделаете это:
scatter3d(prestige ~ income + education, data=Duncan)
Вы получаете это (взято с программой скриншота)
![enter image description here](https://i.stack.imgur.com/HklA3.png)