2013-10-28 3 views
1

해시 맵의 값 유형을 변경하려고합니다. 해시 맵에는 csv 파일에서 가져온 데이터가 들어 있습니다. 문자열에서)이 문제 만들기, 문자열로 모든 것을 가져가 떠하기 :Clojure : 해시 맵 값에 함수를 적용하는 방법 (일부는 벡터)

예 입력 :

(def toydata {"EGFR" ["12.34" "4.45" "1.32"], "MYCN" "5.11", "ABC9" ["3.21" "1.32"]}) 

내가 원하는 무엇 :

{"EGFR" [12.4 4.45 1.32] "MYCN" 5.11 "ABC9" [3.21 1.32]} 

나는 토마스 SO 여기에 좋은 예를 발견 아래에 나와 있지만, 내지도에이 함수를 호출 할 때

(defn remap [m f] 
    (reduce (fn [r [k v]] (assoc r k (apply f v))) {} m)) 

: 벡터이다 맵 값에 대해 작동하지 않는 것

ClassCastException clojure.lang.PersistentVector cannot be cast to java.lang.String 

:

(remap toydata #(Float/parseFloat %)) 

오류가 발생합니다 누구든지 도와 줄 수 있습니까?

답변

2

문제는 remap의 (apply f v) 부분에 f가 다중 arity 함수 여야한다는 것입니다.

(defn remap [m f] 
    (reduce (fn [r [k v]] (assoc r k (f v))) {} m)) 

을 다음

(remap toydata (fn[x] 
    (if (coll? x) (into [] (map #(Float/parseFloat %) x)) (#(Float/parseFloat %) x)))) 

출력을 수행합니다 :이처럼되고 다시 매핑 변경됩니다

{"MYCN" 5.11, "ABC9" [3.21 1.32], "EGFR" [12.34 4.45 1.32]} 
+0

아, 인수에 대응합니다. 배울 것이 많습니다. Diego는 완벽하게 작동했습니다. –

관련 문제