Насколько мала "стрелка нулевой длины"? - PullRequest
0 голосов
/ 07 октября 2018

Если вы использовали функцию arrows достаточно часто, вы, вероятно, столкнулись с этим предупреждением:

set.seed(438520)
N = 1000
x = rnorm(N, sd = .1)
y = rnorm(N)

png('~/Desktop/arrows.png', height = 240, width = 240)
plot(NA, xlim = c(-1, 1), ylim = c(-3, 3))
arrows(x[-N], y[-N], x[-1L], y[-1L])
dev.off()

Предупреждение: стрелками (x [-N], y[-N], x [-1L], y [-1L]): стрелка нулевой длины имеет неопределенный угол и поэтому пропускается

small arrow

Как мы можем определить, какие стрелки виноваты, чтобы справиться с ними, как нам кажется?

1 Ответ

0 голосов
/ 07 октября 2018

Ответ указывается в ?arrows:

Направление стрелки нулевой длины не определено, и, следовательно, так же, как и направление стрелок.Чтобы учесть ошибку округления, стрелки не указываются (с предупреждением) на любой стрелке длиной менее 1/1000 дюйма.

Что, конечно, вызывает вопрос - Что такое дюйм?

То, что вопросы и ответы были сосредоточены вокруг связанной с этим проблемы, но здесь также можно применить уроки:

png('~/Desktop/arrows.png', height = 240, width = 240)
plot(NA, xlim = c(-1, 1), ylim = c(-3, 3))

# get each arrow's length by converting x and y coords to inches
units = par(c('usr', 'pin'))
x_to_inches = with(units, pin[1L]/diff(usr[1:2]))
y_to_inches = with(units, pin[2L]/diff(usr[3:4]))

dists = sqrt((x_to_inches * diff(x))**2 + (y_to_inches * diff(y))**2)

# which arrows are the culprits?
idx = which(dists < .001)

# option: remove the arrow base & head from the culprit pair(s)
arrows(x[-c(N, idx)], y[-c(N, idx)], 
       x[-c(1L, idx + 1L)], y[-c(1L, idx + 1L)])
dev.off()

Вы можете увидеть здесь в Rисточник, что этот подход почти идентичен тому, который использовался (на уровне C) для генерации этого предупреждения, во-первых.

Что-то, что всегда мешало мне, но никогда не было достаточно, чтобы сесть и разобрать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...