Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何用字符串键解构映射并解析-有没有一种简洁(er)的方法?_Clojure - Fatal编程技术网

Clojure 如何用字符串键解构映射并解析-有没有一种简洁(er)的方法?

Clojure 如何用字符串键解构映射并解析-有没有一种简洁(er)的方法?,clojure,Clojure,我有一个函数,在其中我使用键上的:strs来破坏地图。我可以很容易地分解为字符串(如下所示),然后将字符串单独解析为整数(未显示),但我正在寻找一种更简洁的方法——最好是在使用:strs的赋值中 如果您有任何建议,我将不胜感激。您也可以对函数的其余部分发表意见,我很乐意学习 (def t1 ["chr1" "85742012" "." "G" "C" "2383.75" "PASS" "AF=0.993671;AO=157;DP=158;FAO=157;FDP=158;FR=.;FRO=

我有一个函数,在其中我使用键上的:strs来破坏地图。我可以很容易地分解为字符串(如下所示),然后将字符串单独解析为整数(未显示),但我正在寻找一种更简洁的方法——最好是在使用:strs的赋值中

如果您有任何建议,我将不胜感激。您也可以对函数的其余部分发表意见,我很乐意学习

(def t1 ["chr1" "85742012"  "." "G" "C" "2383.75"   "PASS"  "AF=0.993671;AO=157;DP=158;FAO=157;FDP=158;FR=.;FRO=1;FSAF=111;FSAR=46;FSRF=1;FSRR=0;FWDB=-0.0106874;FXX=0;HRUN=1;LEN=1;MLLD=115.26;QD=60.3481;RBI=0.0173573;REFB=-0.0963825;REVB=0.0136769;RO=1;SAF=111;SAR=46;SRF=1;SRR=0;SSEN=0;SSEP=0;SSSB=-0.00426731;STB=0.502242;STBP=0.593;TYPE=snp;VARB=0.000132517;OID=.;OPOS=85742012;OREF=G;OALT=C;OMAPALT=C"   "GT:GQ:DP:FDP:RO:FRO:AO:FAO:AF:SAR:SAF:SRF:SRR:FSAR:FSAF:FSRF:FSRR" "1/1:9:158:158:1:1:157:157:0.993671:46:111:1:0:46:111:1:0"])

(defn extract-vcf-single
[vcf-row]
(let [[chrom posn id ref- alt- qual filt info dt-form-str dt-val-str] vcf-row
    dt-form (str/split dt-form-str #":")
    dt-val (str/split dt-val-str #":")
    dt (zipmap dt-form dt-val)
    {:strs [GT RO AO DP]} dt
    ;; R0, A0 and DP are all integers. Is there a neat way to parse them in the destruct? so I can do this?
    ;; LAF (if (> RO AO) (/ RO DP) (/ AO DP))
    ] {(str chrom "_" posn)[chrom posn GT DP]}))
我所能做的最好的事情就是

(defn extract-vcf-single
[vcf-row]
(let [[chrom posn id ref- alt- qual filt info dt-form-str dt-val-str] vcf-row
    dt-form (str/split dt-form-str #":")
    dt-val (str/split dt-val-str #":")
    dt (zipmap dt-form dt-val)
    {:strs [GT RO AO DP]} dt
    [ROi AOi DPi] (map #(Integer. %) [RO AO DP])
    LAF (if (> ROi AOi) (/ ROi DPi) (/ AOi DPi))
    ] {(str chrom "_" posn)[chrom posn GT DPi LAF]}))

我会考虑创建一个函数,该函数将函数应用于一个映射中的特定值,例如:

(defn multi-update
  [m ks f]
  (reduce (fn [acc k]
            (update-in acc [k] f))
          m
          ks))
之后,您可以首先将特定值解析为整数,然后执行实际的分解:

(let [{:strs [GT RO]} (multi-update {"GT" "2"
                                     "FOOBAR" "BAZ"
                                     "RO" "6"}
                                    ["GT" "RO"]
                                    #(Integer/parseInt %))]
  [GT RO])
;=> [2 6]