Я создал симуляцию в NetLogo и хочу провести несколько экспериментов на кластере Linux. Мне нужно заменить путь к файлу в установочном файле xml.
<enumeratedValueSet variable = "str_critterpath">
<value value = ""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</enumeratedValueSet>
Это новый файл, созданный в сценарии R, который создает различные входные данные csv для использования NetLogo. Я собираюсь настроить одиночные запуски с помощью команды system () в сценарии R.
Вот мой сценарий R с некоторыми отметками, обозначающими, где мне нужно сделать копию файла xml с другим путем. Возможно, я захочу изменить другие переменные на более позднем этапе.
library(gtools)
CreatCritterCSV = function(Run, NoCritters){
x <- 1:21
for (i in 1:10){
print(i)
aperm = t(as.matrix(permute(x), nrow =1, ncol=21))
if (i ==1){
df = data.frame(aperm)
}else{
df[i,] = aperm
}
}
filename = paste("critters", Run, ".csv", sep = "")
write.table(df, file = filename,row.names=FALSE, na = "",col.names=FALSE, sep = ",")
return(filename)
}
args <- commandArgs(trailingOnly = TRUE)
rnorm(RunNo=as.numeric(args[1]), NumberCritters=as.numeric(args[2]))
csvInput = CreatCritterCSV(RunNo, NumberCritters)
InSetupfile = "setup.xml"
#Replace the filepath to critters.csv
#
#
#
#
setupfile = paste("setup", RunNo, ".xml", sep = "")
NetLogoCommand = paste("/home/users/zabados/NetLogo/netlogo-headless.sh --model '/home/users/zabados/Ran.nlogo' --setup-file", setupfile, "--experiment experiment --table RanTest.csv", sep = " ")
system(NetLogoCommand)
Таким образом, установочный файл xml выглядит следующим образом:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<!DOCTYPE experiments SYSTEM "behaviorspace.dtd">
<experiments>
<experiment name = "experiment" repetitions = "1" runMetricsEveryStep = "false">
<setup>setup</setup>
<go>go</go>
<exitCondition>StoppingStable</exitCondition>
<metric>saveOutSingles</metric>
<enumeratedValueSet variable = "DiffIntraDen">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffWalk">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "maxReproRate">
<value value = "0.05"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "NumberZetas">
<value value = "0"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "interdensity">
<value value = "1"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "ExtraMort">
<value value = "0.5"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffMaxRepro">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "intraRadius">
<value value = "0"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffSpeeds">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "GenSpec">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffInterDen">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffSpdCoe">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffStartNum">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "interRadius">
<value value = "5"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "PopGrowExp">
<value value = "0.5"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "SameSpeed">
<value value = "5"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "logiMidpoint">
<value value = "11"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "Imortal_infert">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DisplaySpecies">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DripFeedRate">
<value value = "0"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "StartingExp">
<value value = "10"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffExtraMort">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "SimpleDensity">
<value value = "true"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "str_critterpath">
<value value = ""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</enumeratedValueSet>
<enumeratedValueSet variable = "intradensity">
<value value = "2"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "max_age">
<value value = "3"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "WalkType">
<value value = ""Logistic""/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffAge">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DripFeedNumber">
<value value = "1"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "SpeciesPresenceCutOff">
<value value = "1"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "SpeedCoef">
<value value = "0.4"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "DiffPopGrExp">
<value value = "false"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "walk_exp">
<value value = "0.6"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "CRW_multi">
<value value = "90"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "StartingEachSpecies">
<value value = "30"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "PrefMoveExp">
<value value = "0.5"/>
</enumeratedValueSet>
<enumeratedValueSet variable = "MemLen">
<value value = "2000"/>
</enumeratedValueSet>
</experiment>
</experiments>
Любая помощь будет принята с благодарностью. Я попытался использовать gsub xml, как если бы это был текстовый файл, без всякой радости, и проанализировать xml-файл с помощью пакета r xml. Быстро никуда не денешься.
Ваше здоровье.
На данный момент мне нужно было изменить это. Мне может потребоваться изменить другие вещи в будущих запусках, но теперь я могу изменить вашу функцию ниже, если потребуется, чтобы взять другую строку path_node_index. Приведенный выше сценарий автоматически генерирует файл csv, поэтому его необходимо автоматически добавлять в файл xml. С вашей помощью у меня теперь есть рабочий сценарий. Спасибо Джордан
Если вам просто нужно изменить значение пути к файлу в XML-файле, попробуйте эту функцию:
modify_xml_filepath <- function(original_xml,
new_filepath = "",
new_experiment_name = "new_experiment.xml") {
# Parse the original file
parsed <- read_xml(original_xml)
nodeset <- xml_children(xml_children(parsed)[[1]])
# Get the node that stores the current path
path_node_index <- which(xml_attrs(nodeset) == "str_critterpath")
# Save the current value for removal
to_remove <- xml_children(nodeset[[path_node_index]])
# Add the new filepath, then remove the old one
xml_add_child(nodeset[[path_node_index]], "value", "value" = new_filepath)
xml_remove(to_remove)
# Write out the modified file
write_xml(parsed, new_experiment_name)
}
Вызывается так:
modify_xml_filepath(original_xml = "example_experiment.xml",
new_filepath = "new_filepath_here",
new_experiment_name = "new_output.xml"
)
Выводит для меня новый XML-файл с именем "new_output.xml", в котором str_critterpath
изменен на:
<enumeratedValueSet variable = "str_critterpath">
<value value = "new_filepath"/>
</enumeratedValueSet>
Редактировать: Чтобы включить цитаты в выходной XML-файл (как в исходном), добавьте эту строку над первой строкой xml_add_child(...
:
new_filepath = paste("\"", new_filepath, "\"", sep = "")
Новый узел пути к файлу теперь будет выглядеть так:
<enumeratedValueSet variable = "str_critterpath">
<value value = ""new_filepath_here""/>
</enumeratedValueSet>
Спасибо. Это сработало отлично. Это первый вопрос, который я задала после того, как много лет читала и тратила часы, а иногда и дни на поиск решений самостоятельно. Ваш ответ сэкономил мне кучу времени и именно то, что мне было нужно. Спасибо еще раз.
@JordanChetcuti - Рад, что вы на правильном пути, хорошая работа с модификацией! Взгляните на мою правку, чтобы найти возможную альтернативу вашему решению проблемы с цитатой, но я могу ошибиться, если у вас нет quot
, как в исходном пути к файлу.
Этот мод работает очень аккуратно. Спасибо :)
Для всех, кто пытается заставить это решение работать с Netlogo и компьютерным кластером, мне пришлось внести небольшую поправку в решение Люка С. Это связано с тем, что xml-файл нуждается в "вокруг пути к файлу". Я попытался просто добавить их в путь к файлу и в итоге получил "& amp" quot;, что вызвало проблемы. Поэтому я сделал некоторые замены. Это менее красиво, но теперь работаю над кластер.
modify_xml_filepath <- function(original_xml,
new_filepath = "",
new_experiment_name = "new_experiment.xml") {
# Parse the original file
parsed <- read_xml(original_xml)
nodeset <- xml_children(xml_children(parsed)[[1]])
# Get the node that stores the current path
path_node_index <- which(xml_attrs(nodeset) == "str_critterpath")
# Save the current value for removal
to_remove <- xml_children(nodeset[[path_node_index]])
New = gsub("C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv", new_filepath, to_remove)
New = sub("<", "", New)
New = sub("/>", "", New)
# Add the new filepath, then remove the old one
#xml_add_child(nodeset[[path_node_index]], "value", "value" = new_filepath)
xml_add_child(nodeset[[path_node_index]], New)
xml_remove(to_remove)
# Write out the modified file
write_xml(parsed, new_experiment_name)
}
Модификация Люка С намного аккуратнее и выполняет свою работу.
Итак, единственное, что вам нужно изменить в вашем XML-файле, - это путь к файлу? Вы вручную вводите новый путь к файлу cristers.csv?