library(tidyverse) col <- "cut" foo <- function(df, col) { df %>% mutate(!!sym(col) := tolower(!!sym(col))) } foo(diamonds, col)
Извлечь Передать строку как имя переменной в dplyr :: filter .
Поиск этого в моем удобном Harbison & Steele ....
Определите максимальную ширину полей.
int max_width, value_to_print;
max_width = 8;
value_to_print = 1000;
printf("%*d\n", max_width, value_to_print);
Имейте в виду, что max_width должно иметь тип int
для работы со звездочкой, и вам придется рассчитывать его на основе того, сколько места вы хотите иметь. В вашем случае вам придется рассчитать максимальную ширину наибольшего числа и добавить 4.
Почему printf ("% 8d \ n", intval);
не работает для вас ? Это должно ...
Вы не показывали строки формата ни для одного из ваших «не работающих» примеров, поэтому я не уверен, что еще вам сказать.
#include <stdio.h>
int
main(void)
{
int i;
for (i = 1; i <= 10000; i*=10) {
printf("[%8d]\n", i);
}
return (0);
}
$ ./printftest
[ 1]
[ 10]
[ 100]
[ 1000]
[ 10000]
РЕДАКТИРОВАТЬ: ответ на уточнение вопроса :
#include <math.h>
int maxval = 1000;
int width = round(1+log(maxval)/log(10));
...
printf("%*d\n", width, intval);
Расчет ширины вычисляет логарифмическую базу 10 + 1, которая дает количество цифр. Причудливый *
позволяет вам использовать переменную для значения в строке формата.
Вам все еще нужно знать максимум для любого заданного прогона, но на любом языке или карандаше нет способа обойти это. бумага.
printf("%8d\n",1);
printf("%8d\n",10);
printf("%8d\n",100);
printf("%8d\n",1000);
Попробуйте преобразовать в строку, а затем используйте «% 4.4s» в качестве спецификатора формата. Это делает его фиксированным форматом ширины.
Полностью непереносимое решение Linux:
#include <stdio.h>
#include <unistd.h>
int main()
{
char buffer[BUFSIZ];
readlink("/proc/self/exe", buffer, BUFSIZ);
printf("%s\n", buffer);
}
Использует трюк "/ proc / self", который указывает на запущенный процесс. Таким образом, это избавляет от необходимости искать PID. Обработка ошибок оставлена как упражнение для осторожных.
Единственное решение - это отсканировать данные перед печатью, чтобы выяснить самый широкий элемент данных, и найти значение ширины, которое можно передать в printf с помощью оператора asterix, например,loop over data - get correct padding, put into width
printf( "%*d\n", width, datum );
Итак, вы хотите поле шириной 8 символов с пробелами в качестве отступа? Попробуйте "% 8d". Вот ссылка .
РЕДАКТИРОВАТЬ : То, что вы пытаетесь сделать, - это не то, что может быть обработано одним только printf, потому что оно не будет знать, какое самое длинное число вы пишете. Вам нужно будет вычислить наибольшее число перед выполнением любых printfs, а затем выяснить, сколько цифр использовать в качестве ширины вашего поля. Затем вы можете использовать snprintf или аналогичный для создания формата printf на месте.
char format[20];
snprintf(format, 19, "%%%dd\\n", max_length);
while (got_output) {
printf(format, number);
got_output = still_got_output();
}
Если вы не можете знать ширину заранее, тогда ваш единственный возможный ответ будет зависеть от размещения вашего вывода во временном буфере некоторого вида. Для небольших отчетов проще всего собрать данные и отложить вывод до ограниченного ввода.
Для больших отчетов может потребоваться промежуточный файл, если собранные данные превышают разумные границы памяти.
Как только у вас есть данные затем просто обработать его в отчете, используя идиому printf ("% * d", ширина, значение)
для каждого значения.
В качестве альтернативы, если выходной канал разрешает произвольный доступ, Вы можете просто написать черновик отчета, который предполагает (короткую) ширину по умолчанию, а затем отыскивать и редактировать его всякий раз, когда ваше допущение ширины нарушается. Это также предполагает, что вы можете заполнить строки отчета за пределами этого поля каким-то безобидным способом,
Глядя на отредактированный вопрос, вам нужно найти количество цифр в наибольшем числе, которое будет представлено, а затем сгенерируйте формат printf ()
, используя sprintf ()
, или используя % * d
с количеством цифр, передаваемых в виде целого числа для *
, а затем значение. Получив наибольшее число (и вы должны определить это заранее), вы можете определить количество цифр с помощью алгоритма «целочисленного логарифма» (сколько раз вы можете разделить на 10, прежде чем доберетесь до нуля), или используя snprintf ()
с нулевой длиной буфера, формат % d
и ноль для строки; возвращаемое значение говорит вам, сколько символов было бы отформатировано.
Если вы не