1

そこで、さまざまなポートの座標を点でプロットするマッピング関数を作成しています。ユーザーがラベル付けするポートを選択して、ラベルの位置を変更できる機能を作成したいと考えています。

さまざまなポートとその座標を次に示します。

           Labels       Lon      Lat
1     Halifax, NS -63.59341 44.68068
2  St. John's, NL -52.73304 47.59341
3  Saint John, NB -66.05236 45.27925
4    Portland, ME -70.24435 43.68068
5  Woods Hole, MA -70.68068 41.62832
6 Nuuk, Greenland -51.75049 64.17453
7      Boston, MA -71.08727 42.36652

そして私の機能:

    port.label <- function (pos1, cex1 = 0.6, offset1 = 0.2, col1 = "deeppink") {
      port.file<-read.csv("V:/Science/Finalised Map Files/Ports.csv")
      Lon <- port.file$Lon
      Lat <- port.file$Lat
      Lab <- paste(port.file$Lab) 
      a <- locator()
      ay <- unlist(a[2])
      aylab <- sapply (ay, function (x) which.min (abs (x - Lat)))
      b <- for (i in (1:length (aylab))) {
        text (x = Lon [aylab[i]], y = Lat [aylab[i]], labels = Lab [aylab[i]],
        pos = pos1, cex = cex1, offset = offset1, col = col1) 
      }
    }

今、私はそれを実行しようとすると: port.label(pos1=c(1,2,3,4))4 つの点をクリックした後、最初の値 (1) のみを使用してラベルを返します。したがって、最初の値のみを取得しています。クリックされたポートの数に関連するように pos1 の長さを事前に設定しようとしましたが、これも役に立ちませんでした。

ベクトル全体ではなく、最初の pos1 値のみを取る理由についてのアイデアはありますか? ありがとう。

4

2 に答える 2

1

ええと、 text() の呼び出しごとに、完全なベクトルで呼び出しているためです。各呼び出しは 1 つのラベルのみを対象としているため、 で呼び出す必要がありますpos=pos1[i]。残念ながら、引数を 1 つだけ指定して port.label を呼び出すと、pos1() の長さをさらにチェックする必要があります。たとえば、すべてのラベルを同じ位置、下に配置したいので、 を呼び出しますport.label( pos1= 1 )。でi=2pos1[i]値を取りますNA。したがって、pos1長さが 1 の場合は拡張する必要があります。

次のように呼び出す方が効率的です。

port.label <- function (pos1, cex1 = 0.6, offset1 = 0.2, col1 = "deeppink") {
  port.file<-read.csv("V:/Science/Finalised Map Files/Ports.csv")
  Lon <- port.file$Lon
  Lat <- port.file$Lat
  Lab <- paste(port.file$Lab) 
  a <- locator()
  ay <- unlist(a[2])
  aylab <- sapply (ay, function (x) which.min (abs (x - Lat)))
  text( x= Lon[aylab], y= Lat[aylab], labels= Lab[aylab], 
        pos= pos1, cex= cex1, offset= offset1, col= col1 )
}
于 2013-07-10T17:57:54.730 に答える