Вы могли бы также рассмотреть базовые графики R, которые я нахожу немного более простыми.
par(mar=c(5, 5, 4, 5) + 0.1) # adjust plot margins
b <- barplot(Pyay$Mean.monthly.discharge, col="blue", # plots and saves x-coordinates
ylim=c(0, 90),
ylab=expression(Q/(m^{3})))
lines(b, Pyay$Mean.suspended.sediment.load, col="red", lwd=2) # use x-coordinates here
axis(1, b, labels=Pyay$Month)
axis(4, seq(0, 90, 20), labels=, seq(0, 90, 20))
mtext(expression(Suspended~sediment~load~(10^{6}~t)), 4, 3)
legend("topleft", legend=c("discharge", "SSL"), pch=c(15, NA),
pt.cex=2, lty=c(0, 1), col=c("blue", "red"))
box()
Данные
Pyay <- structure(list(Month = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), Mean.monthly.discharge = c(8.528,
6.316, 7, 8.635, 12.184, 30.414, 70.753, 79.255, 67.079, 53.677,
22.937, 12.409), Mean.monthly.max.temperature = c(32.2, 35.1,
37.6, 38.7, 36, 31.9, 31, 31, 32.3, 33.5, 32.7, 31.5), Mean.suspended.sediment.load = c(3.407,
2.319, 2.587, 3.573, 5.785, 21.811, 70.175, 81.873, 65.798, 47.404,
14.468, 5.842), Max.monthly.rainfall = c(1.5, 0.9, 5.1, 27.3,
145.1, 234.8, 198, 227.5, 205.7, 124, 56, 1.5), Mean.monthly.minimum.temperature = c(16.2,
17.8, 21.2, 24.7, 25.6, 24.8, 24.8, 24.7, 24.6, 24.2, 21.7, 18.1
)), row.names = c(NA, -12L), class = "data.frame")
PHP не поддерживает названные параметры для функций по сути. Однако существуют некоторые способы обойти это:
Вариация на метод массива, который допускает более легкую установку значений по умолчанию:
function foo($arguments) {
$defaults = array(
'firstName' => 'john',
'lastName' => 'doe',
);
$arguments = array_merge($defaults, $arguments);
echo $arguments['firstName'] . ' ' . $arguments['lastName'];
}
Использование:
foo(array('lastName' => 'smith')); // output: john smith
Вы могли осуществить рефакторинг свой код немного:
function foo($firstName = NULL, $lastName = NULL)
{
if (is_null($firstName))
{
$firstName = 'john';
}
if (is_null($lastName ))
{
$lastName = 'doe';
}
echo $firstName . " " . $lastName;
}
foo(); // john doe
foo('bill'); // bill doe
foo(NULL,'smith'); // john smith
foo('bill','smith'); // bill smith
Нет нет всего лишь, Вы могли использовать массив:
function foo ($nameArray) {
// Work out which values are missing?
echo $nameArray['firstName'] . " " . $nameArray['lastName'];
}
foo(array('lastName'=>'smith'));
Путем Вы хотите: нет.
Вы могли использовать некоторую специальную метку, как ПУСТОЙ УКАЗАТЕЛЬ, чтобы отметить, что значение не предоставляется:
function foo($firstName, $lastName = 'doe') {
if (is_null($firstName))
$firstName = 'john';
echo $firstName . " " . $lastName;
}
foo(null, 'smith');
Нет. Обычный способ сделать это с некоторой эвристикой для определения, какой параметр подразумевался, как длина строки, ввод, и т.д.
Вообще говоря, Вы записали бы функцию для взятия параметров в порядке самых необходимых к наименее необходимому.
Если у Вас есть несколько дополнительных параметров, одно решение состоит в том, чтобы передать единственный параметр, который является массивом хеша:
function foo(array $params = array()) {
echo $params['firstName'] . " " . $params['lastName'];
}
foo(array('lastName'=>'smith'));
Конечно, в этом решении нет никакой проверки, что поля массива хеша присутствуют, или записаны правильно. Это - все до Вас для проверки.
Печально то, что Вы пытаетесь сделать, не имеет никакого "синтаксического сахарного" способа сделать его. Они - все различные формы WTF.
Если Вам нужна функция, которая берет неопределенное количество произвольных параметров,
function foo () {
$args = func_get_args();
# $args = arguments in order
}
Добьется цели. Попытка избегает использования его слишком много, потому что для Php это находится немного на волшебной стороне.
Вы могли затем дополнительно применить значения по умолчанию и сделать странные вещи на основе количества параметра.
function foo(){
$args = func_get_args();
if( count($args) < 1 ){
return "John Smith";
}
if( count($args) < 2 ) {
return "John " .$args[0];
}
return $args[0] . " " . $args[1];
}
Кроме того, Вы могли дополнительно эмулировать параметры стиля Perl,
function params_collect( $arglist ){
$config = array();
for( $i = 0; $i < count($arglist); $i+=2 ){
$config[$i] = $config[$i+1];
}
return $config;
}
function param_default( $config, $param, $default ){
if( !isset( $config[$param] ) ){
$config[$param] = $default;
}
return $config;
}
function foo(){
$args = func_get_args();
$config = params_collect( $args );
$config = param_default( $config, 'firstname' , 'John' );
$config = param_default( $config, 'lastname' , 'Smith' );
return $config['firstname'] . ' ' . $config['lastname'];
}
foo( 'firstname' , 'john', 'lastname' , 'bob' );
foo( 'lastname' , 'bob', 'firstname', 'bob' );
foo( 'firstname' , 'smith');
foo( 'lastname', 'john' );
Конечно, было бы легче использовать аргумент Array здесь, но Вам разрешают иметь выбор (даже плохие пути) выполнения вещей.
заметно, это более хорошо в Perl, потому что можно сделать просто нечто (firstname => 'Джон');