Здесь что-то вроде y$ColB[which(x$Col1 == round(median(x$Col1)))]
сделало бы свое дело.
Проблема в том, что x
имеет четное число строк, поэтому медиана 2.5
не является целым числом. В этом случае вы должны выбрать между 2
или 3
.
Примечание. Вышеприведенное работает для вашего примера, а не для общих случаев (например, c(-2L,2L)
или с рациональными числами). Для более общего случая см. Решение @ IceCreamToucan.
Если Вы просто хотите обработать параметры командной строки сами, самый легкий путь состоит в том, чтобы поместить:
vector<string> args(argv + 1, argv + argc);
наверху Вашего main()
. Это копирует все параметры командной строки в вектор std::string
s. Затем можно использовать ==
сравнить строки легко, вместо бесконечного strcmp()
вызовы. Например:
int main(int argc, char **argv) {
vector<string> args(argv + 1, argv + argc);
string infname, outfname;
// Loop over command-line args
// (Actually I usually use an ordinary integer loop variable and compare
// args[i] instead of *i -- don't tell anyone! ;)
for (vector<string>::iterator i = args.begin(); i != args.end(); ++i) {
if (*i == "-h" || *i == "--help") {
cout << "Syntax: foomatic -i <infile> -o <outfile>" << endl;
return 0;
} else if (*i == "-i") {
infname = *++i;
} else if (*i == "-o") {
outfname = *++i;
}
}
}
[РЕДАКТИРОВАНИЕ: Я понял, что копировал argv[0]
, название программы, в args
- фиксированный.]
Я предложил бы пользоваться библиотекой. Существует классический и почтенный getopt, и я уверен другие.
Если бы Вы не хотите использовать повышение, я рекомендовал бы этот небольшой класс помощника.
Есть несколько хороших доступных библиотек.
Опции программы Boost - это довольно тяжеловесное решение, потому что для его добавления в ваш проект требуется повышение, а синтаксис несколько сбивает с толку (на мой взгляд). Тем не менее, он может делать практически все, включая параметры командной строки, которые переопределяют параметры, заданные в файлах конфигурации.
SimpleOpt - довольно сложный, но простой процессор командной строки. Это отдельный файл, имеющий простую структуру, но он обрабатывает только командную строку и разбирает ее на опции, вам нужно выполнить все проверки типов и диапазонов. Это хорошо как для Windows, так и для Unix, и поставляется с версией glob для Windows.
Getopt доступен в Windows. Он такой же, как на машинах Unix, но часто это библиотека GPL.
Это мой любимый способ работы с командной строкой, особенно, но определенно не только, когда эффективность является проблемой. Это может показаться излишеством, но я думаю, что недостатков у этого излишества немного.
Используйте gperf для эффективной обработки командной строки на C/C++
Недостатки:
Преимущества:
Используя IDE вроде eclipse, вы, вероятно, сможете автоматизировать процесс запуска gperf, так что единственное, что вам нужно будет сделать, это добавить опцию в конфигурационный файл и в оператор switch и нажать кнопку build...
Я использовал пакетный файл, чтобы запустить gperf и сделать некоторую очистку и добавить защитные элементы с помощью sed (в сгенерированный gperf .hpp файл)...
Итак, чрезвычайно лаконичный и чистый код в вашей программе и один автоматически генерируемый файл хэш-таблицы, который на самом деле не нужно изменять вручную. Я сомневаюсь, что boost::program_options сможет превзойти это даже без приоритета эффективности.