Можно ли сохранять части кода в переменной?

Вот одна часть моего сценария:

if (PNG == 1) {
    set terminal png size 1024,768 font "Arial,11"
    SAVE_AS = FILENAME.'.png'
    print "    - Create file: ".SAVE_AS
    set output SAVE_AS
    plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
         DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
}

if (SVG == 1) {
     set term svg size 600,400 dynamic font 'Arial,11'
     SAVE_AS = FILENAME.'.svg'
     print "    - Create file: ".SAVE_AS
     set output SAVE_AS
    plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
         DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
}

Как вы можете видеть, график DATA_FILE... встречается в моем коде дважды: один раз в PNG-части и один раз в SVG-части. Можно ли поместить код в какую-то переменную и потом ссылаться на эту переменную.

Вот некоторый псевдокод:

a = DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
    DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2

if (PNG == 1) {
    ...
    plot a
}

if (SVG == 1) {
     ...
    plot a
}

Редактировать:

Вот весь скрипт:

# Run as follows:
#    
#  gnuplot.exe -e "DATA_FILE='<path/to/root/>/input/PEDS_1.csv'; PIC_FOLDER='<path/to/root/>/output';
#                  SEQ='PEDS_1'; X_MAX=50; PNG=1; SVG=1" <filename>.gplt
#
# The variables are as follows:
#  DATA_FILE : The output CSV file
#  PIC_FOLDER: The full path of the folder, where the created graphs should be saved
#  SEQ       : The name of the Sequence
#  X_MAX     : The maximum simulation time (in hours) to be displayed. Default value is 50:
#  PNG       : Set 1 if a PNG graph should be created. Default value is 0.
#  SVG       : Set 1 if a SVG graph should be created. Default value is 0.

# Set default values
if (!exists('X_MAX')){
     X_MAX = 50
}

if (!exists('PNG')){
     PNG = 0
}

if (!exists('SVG')){
     SVG = 0
}

# Get the filename of this gnuplot script
SCRIPT_FILENAME = ARG0[strlen(ARG0)-8:strlen(ARG0)-5]

# Set the filename (without extension)
FILENAME = PIC_FOLDER.'/'.SEQ.'___'.SCRIPT_FILENAME

set encoding utf8
set datafile separator ','
set key autotitle columnhead
set title "KPDS «".SEQ."»" noenhanced

# x-Axis
set xlabel 'Time (h)' offset -2,0,0
set xrange [0:X_MAX]
set mxtics 10

# y-Axis
set ylabel 'Power (MW)' textcolor "red" offset 2,0,0
set yrange [0:100]
set ytics textcolor "red"
set mytics 10

# y2-Axis
set y2label 'Pressure (bara)' textcolor rgb "blue" offset -2,0,0
set y2range [0:100]
set y2tics textcolor rgb "blue"
set my2tics 10

# Grid
set grid linetype 2 linewidth 0.2 linecolor rgb '#DCDCDC'
set grid mxtics
set grid mytics

# Legend
set key off title

if (PNG == 1) {
    set terminal png size 1024,768 font "Arial,11"
    SAVE_AS = FILENAME.'.png'
    set output SAVE_AS
    plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1,\
         fname using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x1y2
}

if (SVG == 1) {
    set term svg size 600,400 dynamic font 'Arial,11'
    SAVE_AS = FILENAME.'.svg'
    set output SAVE_AS
    plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1,\
         fname using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x1y2
}

Извините за первое сообщение, где я его не предоставил.

Я думаю, что вам нужен macro. Gnuplot поддерживает расширение строковых переменных в командах. Например var = "using 1:3"; plot 'data.txt' @var . Однако var должна быть постоянной строкой!

kvantour 03.06.2024 17:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаком с Gnuplot, но не могли бы вы переместить общий код после операторов if, чтобы уменьшить дублирование?

if (PNG == 1) {
    set terminal png size 1024,768 font "Arial,11"
    SAVE_AS = FILENAME.'.png'
    print "    - Create file: ".SAVE_AS
    set output SAVE_AS
}

if (SVG == 1) {
     set term svg size 600,400 dynamic font 'Arial,11'
     SAVE_AS = FILENAME.'.svg'
     print "    - Create file: ".SAVE_AS
     set output SAVE_AS
}

plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
     DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2

Если вы хотите написать команду построения графиков только один раз, но получить ее в одном или нескольких различных выходных форматах, вы можете использовать команду replot (отметьте help replot). Однако это работает, только если у вас нет мультиграфического графика (проверьте help multiplot). Для мультиплотов вам нужно сделать это по-другому.

Мой терминал по умолчанию — wxt. Таким образом, он сначала построит график в терминале wxt, а если PNG==1 — еще и в PNG-файл, а если SVG==1 — еще и в SVG-файл.

Редактировать: Если вам не нужен график в терминале по умолчанию, вы можете установить терминал на unknown. Это ничего не построит, но выдаст предупреждение в консоли gnuplot, которое, однако, вы можете игнорировать.

Plotting with an 'unknown' terminal.
No output will be generated. Please select a terminal with 'set terminal'.

Сценарий: (Я предпочитаю полные и полностью работающие сценарии копирования и вставки)

### create several output files with identical plot command
reset session

BASENAME = "SO78571143"
PNG      = 1
SVG      = 1

set term unknown
plot sin(x), cos(x)    # your actual plot command

if (PNG == 1) {
    set term pngcairo size 640,348 font "Arial,11"
    OUTPUT = BASENAME.'.png'
    print "    - Create file: ".OUTPUT
    set output OUTPUT
    replot
}

if (SVG == 1) {
    set term svg size 600,400 dynamic font 'Arial,11'
    OUTPUT = BASENAME.'.svg'
    print "    - Create file: ".OUTPUT
    set output OUTPUT
    replot
}
set output  # close output file
### end of script

Результат: вывод в формате PNG и аналогичный вывод в формате SVG.

Ваше решение работает нормально. Знаете ли вы, как подавить открытие окна с изображением графика, которое происходит после построения DATA_FILE...?

ped 13.06.2024 16:37

@ped см. измененный ответ.

theozh 13.06.2024 20:37

Спасибо. Вы абсолютно правы: я мог и должен был создать минимальный пример. Пожалуйста извините меня.

ped 14.06.2024 07:47

@ped, не волнуйся. Иногда важно иметь сценарий и данные для воспроизведения ошибки или определенного поведения. Возможно, не в вашем случае, но не помешает получить какой-то результат без необходимости сначала создавать какие-то значимые данные и завершать фрагмент сценария. Я хочу убедиться, что все сценарии, которые я публикую здесь, работают и протестированы. Итак, проблема решена, вопрос дан? Если да, то примите один из ответов, который решил вашу проблему.

theozh 14.06.2024 10:39
Ответ принят как подходящий

Ответ Gnuplot версии 6 (не применимо к более ранним версиям)

function $myplot(filename) <<EOF
    plot filename using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
         filename using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
EOF

if (PNG == 1) {
    ...
    evaluate $myplot(DATAFILE)
} else if (SVG == 1) {
     ...
    evaluate $myplot(DATAFILE)
}

Ответ Gnuplot версии 5

Более ранние версии gnuplot не поддерживали функциональные блоки, но позволяли использовать команду evaluate для выполнения строковой переменной или функции со строковым значением. Строка ограничена одной строкой текста.

a = "plot DATAFILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1, DATAFILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x"

if (PNG == 1) {
    ...
    evaluate a
} else if (SVG == 1) {
     ...
    evaluate a
}

Второе решение (ответ Gnuplot версии 5) работает. Но мне не нравится ограничение «Строка ограничена одной строкой текста», потому что код сложнее поддерживать.

ped 13.06.2024 17:32

Я использую gnuplot 6. К сожалению, я получил evaluate $myplot(DATA_FILE) ошибку undefined value. Я знаю, что вы назвали переменную DATAFILE, но в моем коде это DATA_FILE.

ped 13.06.2024 17:35

Пожалуйста, покажите точные команды, которые вы использовали. Я предполагал что-то вроде DATA_FILE = "somedir/somename.dat"; evaluate $myplot(DATA_FILE). Функция ожидает строку; совершенно не важно, как называется эта строка.

Ethan 13.06.2024 19:17

Я сделал еще несколько отладочных результатов. Код входит в функцию, и переменная filename имеет то же значение, что и DATA_FILE, что является допустимым путем. Вот вывод: Inside $myplot: c:\Users\...\01_Parameters/AELS_1.csv (я сократил путь к файлу только с помощью ...). Пока я буду придерживаться другого вашего подхода, но интересно понять, почему он не работает.

ped 14.06.2024 07:44

Другие вопросы по теме