Следующая карта не выполняется должным образом - PullRequest
0 голосов
/ 17 октября 2019

У меня есть словарь "данные". И мне нужно проанализировать пару ключ-значение для процесса. Конечный результат должен выглядеть следующим образом:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}

Я написал этот код, и он работает с жестко закодированным значением, а не с переменной "it", на которую я укажу в коде.

data = [
    "a" : "A",
    "b" : "B",
    "c" : [
        "somename":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            ]
        ],

        "somename2":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "5000",
                "ignore": "100",
                "maximum_A": "3500",
                "maximum_B": "22500"
            ]
        ]
    ]
]

carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
//HERE
results = transform_carcodes.flatMap { it ->  [barcode: it, params: data.c."somename".params] }
//HERE
results.subscribe onNext: { println it }

В настоящее время вывод получает правильные ключи, но использует значение жестко закодированного ключа:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}

Почему это не работает, когда я params: data.c.it.params?

Iполучить вывод: Cannot get property 'params' on null object

Я попытался toString(it)

Также, как только я получу вывод, как я могу передать эту пару k / v процессу и порождать новый процессдля каждой пары к / в?

process{
    container "python:3"

    script:
    """
    python3 some_file.py <key> <value>
    """
}

При запуске этот процесс должен появиться:

python3 some_file.py somename {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
python3 some_file.py somename2 {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Если вы сделаете data.c.it.params, it будет считаться еще одним ключом вашей вложенной карты. Как только такого ключа не существует, вы получаете нулевое значение для клавиши params.

Код для создания желаемого результата может выглядеть так:

def data = [....]

data.c.each{ k, v -> 
  "python3 some_file.py $k {${v.params.collect{ "$it.key=$it.value" }join(', ')}}".execute().text
}

каждая строка отображается как

python3 some_file.py somename {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
python3 some_file.py somename2 {minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}
0 голосов
/ 17 октября 2019

В Nextflow вот как мне удалось решить эту проблему:

Хитрость заключается в том, чтобы использовать c[it], а не c.it

carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
results = transform_carcodes.flatMap { it ->  [ [it, data.c[it].params] ] }

process A{
    echo true

    input:
    set x,y from results

    script:
    """
    python3.7 run_me.py ${x} \'${y}\'
    """

}

run_me.py

import sys

print("First:")
print(sys.argv[1])
print("Second:")
print(sys.argv[2])

А на выходе:

[15/aec54c] process > A (1) [100%] 2 of 2 ✔
First:
somename
Second:
[minimum=3000, ignore=60, maximum_A=2500, maximum_B=500]

First:
somename2
Second:
[minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500]
...