2017-10-17 17 views
0

以下の関数を書いて、2つの場所間の移動距離を計算しました。私は以下のベクトルで言及した場所のすべての可能な組み合わせのために上記のプログラムの実行を作りたいベクトルの外積

# Get Distance 
require(RJSONIO) 
address1 = "Noida Sector 62" 
address2 = "Connaught Place" 
url <- "https://maps.googleapis.com/maps/api/distancematrix/json?" 
url <- URLencode(paste(url, "origins=", address1,"&", "destinations=", address2, "&sensor=false", "&units=metric", "&mode=driving", sep = "")) 
x <- fromJSON(url, simplify = FALSE) 
metres = x$rows[[1]]$elements[[1]]$distance$text 

-

address = c("Noida Sector 62" , "Saket", "Delhi University, North Campus", "Laxmi Nagar", "Khan Market", "Connaught Place") 
+0

「アドレス1」は「アドレス2」と等しいことができますか? – PoGibas

+0

'?combn'か(address1 == address2としたいと思ったら)'?outer'を見ることができます。 – Frank

+0

いいえ、同じではありません – john

答えて

1

ここでは、アドレスのすべての組み合わせを取得するためにexpand.gridを使用する解決策があります。

distance <- function(a1, a2){ 
    url <- "https://maps.googleapis.com/maps/api/distancematrix/json?" 
    url <- URLencode(paste(url, "origins=", a1,"&", "destinations=", a2, "&sensor=false", "&units=metric", "&mode=driving", sep = "")) 
    x <- fromJSON(url, simplify = FALSE) 
    metres <- x$rows[[1]]$elements[[1]]$distance$text 
    metres 
} 

address = c("Noida Sector 62" , "Saket", "Delhi University, North Campus", "Laxmi Nagar", "Khan Market", "Connaught Place") 

add <- expand.grid(A1 = address, A2 = address, stringsAsFactors = FALSE) 
add <- add[add$A1 != add$A2, ] 
row.names(add) <- NULL 
d <- apply(add, 1, function(x) distance(x[1], x[2])) 
d 
#[1] "29.0 km" "24.0 km" "10.7 km" "18.1 km" "18.3 km" "27.3 km" "27.0 km" 
# [8] "18.6 km" "11.1 km" "15.8 km" "28.2 km" "28.3 km" "15.3 km" "16.8 km" 
#[15] "8.5 km" "11.3 km" "20.2 km" "15.3 km" "8.8 km" "7.4 km" "18.8 km" 
#[22] "10.9 km" "17.7 km" "8.3 km" "5.5 km" "19.5 km" "14.0 km" "9.4 km" 
#[29] "7.1 km" "4.7 km" 
1

利用combnアドレスのすべての可能な組み合わせを作成する(ここでは、我々はm = 2を使用我々は2つの組み合わせが欲しいので)。ループを使用してペアを反復処理します(fooマトリックス)。

require(RJSONIO) 
api <- "API_SEQUENCE" 

address <- c("Noida Sector 62" , "Saket", "Delhi University, North Campus", "Laxmi Nagar", "Khan Market", "Connaught Place") 

foo <- combn(address, 2) 
metres <- list() 
for(i in 1:ncol(foo)) { 
    address1 <- foo[1, i] 
    address2 <- foo[2, i] 
    url <- "https://maps.googleapis.com/maps/api/distancematrix/json?" 
    url <- URLencode(paste(url, "origins=", address1,"&", "destinations=", address2, "&sensor=false", "&units=metric", "&mode=driving", sep = "")) 
    x <- fromJSON(url, simplify = FALSE) 
    metres[[i]] <- x$rows[[1]]$elements[[1]]$distance$text 
} 

foo[, 1:5] 
    [,1]    [,2]        [,3]    
[1,] "Noida Sector 62" "Noida Sector 62"    "Noida Sector 62" 
[2,] "Saket"   "Delhi University, North Campus" "Laxmi Nagar"  
    [,4]    [,5]    
[1,] "Noida Sector 62" "Noida Sector 62" 
[2,] "Khan Market"  "Connaught Place" 
+0

なぜ 'foo [、i] [1]'で 'foo [1、i]'ではないのですか? –

+0

urlはforループ内にある必要があります。それ以外の場合は、前の反復のリンクが使用されます。また、すべての組み合わせに対してメートルを返しません。 – john

+0

@Johnループ出力が変更されました。繰り返しごとに 'meters'をリストに追加します。 – PoGibas

関連する問題