2016-03-30 53 views
5

Julia中有一個函數的行爲如同R的paste()函數嗎?特別是,如果我們給函數兩個向量,它將返回一個單獨的向量,並且兩個輸入向量的元素級聯。Julia相當於R的paste()函數

我環顧四周,似乎無法在文檔或其他方面找到答案。 An older post by John Myles White建議Julia的join()函數是最接近的類似函數,但它似乎只適用於字符串對,而不適用於字符串向量元素。

現在,我只是使用下面的函數循環調用join()的元素,但我想知道是否有更好的方法。

x = ["aa", "bb", "cc"] 
y = ["dd", "ee", "ff"] 

function mypaste(v1, v2) 
    n = length(v1) 
    res = Array{ASCIIString}(n) 
    for i = 1:n 
     res[i] = join([v1[i], v2[i]]) 
    end 
    return res 
end 

mypaste(x, y) 

運行mypaste()根據需要給出了下面的輸出。

3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

有沒有好的選擇?我誤解了join()函數嗎?

回答

8

我不認爲我會用join可言。 Join用於在一個集合中組合字符串;你在串聯兩個不同的集合之後。所以,雖然很容易(高效的)來創建你需要joinzip臨時集合,你可以通過使用string功能或乘法避免:

julia> map(string, x, y) 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

julia> map(*, x, y) 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

更妙的是(但一半也許是太聰明瞭),有廣播單元乘法運算符.*

julia> x .* y 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 
4

你可以使用一個列表的理解和zip獲得對:

julia> x = ["aa", "bb", "cc"]; 

julia> y = ["dd", "ee", "ff"]; 

julia> [join(i) for i=zip(x,y)] 
3-element Array{ByteString,1}: 
"aadd" 
"bbee" 
"ccff" 
4

map都可以使用。單線是map(join,zip(x,y))。如下面的例子,這也增加了z

julia> x = ["aa","bb","cc"]; 

julia> y = ["dd","ee","ff"]; 

julia> z = ["gg","hh","ii"]; 

julia> map(join,zip(x,y,z)) 
3-element Array{Any,1}: 
"aaddgg" 
"bbeehh" 
"ccffii" 

(見列表理解@DSM答案)