Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы (пользовательский ввод, данные из файлов и т. д.). Подстановку данных можно сделать с помощью форматирования строк. Форматирование можно сделать с помощью оператора %, либо с помощью метода format.
Если для подстановки требуется только один аргумент, то значение — сам аргумент:
>>> 'Hello, {}!'.format('Vasya') 'Hello, Vasya!'
А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных):
>>> '{0}, {1}, {2}'.format('a', 'b', 'c') 'a, b, c' >>> '{}, {}, {}'.format('a', 'b', 'c') 'a, b, c' >>> '{2}, {1}, {0}'.format('a', 'b', 'c') 'c, b, a' >>> '{2}, {1}, {0}'.format(*'abc') 'c, b, a' >>> '{0}{1}{0}'.format('abra', 'cad') 'abracadabra' >>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W') 'Coordinates: 37.24N, -115.81W' >>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'} >>> 'Coordinates: {latitude}, {longitude}'.format(**coord) 'Coordinates: 37.24N, -115.81W'
Однако метод format умеет большее. Вот его синтаксис:
поле замены ::= "{" [имя поля] ["!" преобразование] [":" спецификация] "}" имя поля ::= arg_name ("." имя атрибута | "[" индекс "]")* преобразование ::= "r" (внутреннее представление) | "s" (человеческое представление) спецификация ::= см. ниже
Например:
>>> "Units destroyed: {players[0]}".format(players = [1, 2, 3]) 'Units destroyed: 1' >>> "Units destroyed: {players[0]!r}".format(players = ['1', '2', '3']) "Units destroyed: '1'"
Теперь спецификация формата:
спецификация ::= [[fill]align][sign][#][0][width][,][.precision][type] заполнитель ::= символ кроме '{' или '}' выравнивание ::= "<" | ">" | "=" | "^" знак ::= "+" | "-" | " " ширина ::= integer точность ::= integer тип ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
Выравнивание производится при помощи символа-заполнителя. ‘
Опция «знак» используется только для чисел и может принимать следующие значения:
Флаг | Значение |
‘+’ | Знак должен быть использован для всех чисел. |
‘-‘ | ‘-‘ для отрицательных, ничего для положительных. |
‘Пробел’ | ‘-‘ для отрицательных, пробел для положительных. |
Поле «тип» может принимать следующие значения:
Тип | Значение |
‘d’, ‘i’, ‘u’ | Десятичное число. |
‘o’ | Число в восьмеричной системе счисления. |
‘x’ | Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). |
‘X’ | Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). |
‘e’ | Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). |
‘E’ | Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). |
‘f’, ‘F’ | Число с плавающей точкой (обычный формат). |
‘g’ | Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
‘G’ | Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
‘c’ | Символ (строка из одного символа или число — код символа). |
‘s’ | Строка. |
‘%’ | Число умножается на 100, отображается число с плавающей точкой, а за ним знак %. |
И напоследок, несколько примеров:
>>> coord = (3, 5) >>> 'X: {0[0]}; Y: {0[1]}'.format(coord) 'X: 3; Y: 5' >>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2') "repr() shows quotes: 'test1'; str() doesn't: test2" >>> '{:<30}'. 30}'.format('centered') # use '*' as a fill char '***********centered***********' >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always '+3.140000; -3.140000' >>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers ' 3.140000; -3.140000' >>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}' '3.140000; -3.140000' >>> # format also supports binary numbers >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42) 'int: 42; hex: 2a; oct: 52; bin: 101010' >>> # with 0x, 0o, or 0b as prefix: >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42) 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5 >>> total = 22 >>> 'Correct answers: {:.2%}'.format(points/total) 'Correct answers: 88.64%'
Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>
23 июня 2021
Строка формата, используемая во многих функциях вывода данных (printf, cprintf, sprintf и др. ), состоит из обычных символов, управляющих последовательностей символов и спецификаций полей формата вывода аргументов. Обычные символы и управляющие последовательности просто копируются в выходную строку.
Спецификации полей формата начинаются с символа % и имеют вид:
%[flags] [width] [.precision] [F|КIh|l|L]type
Все символы спецификации записываются без пробелов между ними.
Единственно обязательным элементом спецификации является type — символ, указывающий на тип данных вводимого поля. Остальные необязательные элементы задают параметры форматирования:
Значение | Описание | |
[flags] | Флаги выравнивания, управления печатью знака числа, управления пробелами, десятичной точкой, основанием печати (восьмеричная, шестнадцатеричная) | |
[width] | Ширина поля — минимальное число выводимых символов | |
[. precision] | Спецификатор точности — максимальное количество печатаемых символов или минимальное количество разрядов печатаемого целого | |
[F|N|h|l|L] | Модификаторы, изменяющие размер аргумента по умолчанию: | |
N F h l L | ближний указатель (near) дальний указатель (far) short int long long double |
Ниже приведены возможные значения type.
Символ | Тип аргумента | Формат вывода | |
d | целый | десятичное signed integer | |
i | целый | десятичное signed integer | |
o | целый | восьмеричное unsigned integer | |
u | целый | десятичное unsigned integer | |
x | целый | шестнадцатеричное unsignedint(с цифрами a, b, с, d, е, f) | |
X | целый | то же, что х, но с цифрами А, В, С, D, Е, F | |
f | действительный | формат с фиксированной точкой: [—]dddd. dddd | |
e | действительный | экспоненциальный (научный) формат: [—]d.dddde[+/-]ddd | |
E | действительный | то же, что е, но с символом Е | |
g | действительный | наиболее компактный из форматов е и fдля данного числа и данной точности; незначащие нули не выводятся | |
G | действительный | то же, что g, но с символом Е в экспоненциальном формате | |
Символы | |||
c | символ | один символ | |
s | указатель на строку | строка символов до нулевого символа в конце или с числом символов, заданных точностью | |
% | нет | печать символа % | |
Указатели | |||
n | указатель на int | в ячейку памяти, на которую указывает аргумент, заносится количество выведенных к данному моменту символов | |
p | указатель | печать аргумента как указателя; в зависимости от используемой модели памяти печатается или XXXX:YYYY, или YYYY(только смещение) | |
Перечисленные ниже флаги flags могут записываться в любой последовательности и в любой комбинации. | |||
Флаг | Пояснение | ||
— | Выравнивание влево, оставшееся поле справа заполняется пробелами. Если этот флаг не задан, то производится выравнивание вправо, а оставшееся поле слева заполняется нулями или пробелами. | ||
+ | Обязательно перед числом указывается знак плюс (+) или минус (—) | ||
пробел | Если значение не отрицательное, то печать начинается с пробела вместо знака плюс (+). Для отрицательного значения знак минус (—) печатается. Если наряду с этим флагом задан флаг +, то он должен быть указан до флага пробела. | ||
# | В форматах о, x, X добавляется префикс O, Ox, OX соответственно. В форматах e, E, f, g, G во всех случаях выводится десятичная точка. Кроме того, в форматах g, G не подавляется вывод незначащих нулей. |
Спецификатор width задает минимальную ширину поля. Спецификатор может быть задан или явным образом десятичным числом, или косвенно — символом звездочки (*). В последнем случае предполагается, что ширину поля задает очередной аргумент из списка.
Спецификатор width указывает только минимальную ширину. Если вывод данного аргумента требует большей ширины поля, то поле расширяется и значение никогда не усекается.
Спецификатор может принимать следующие значения:
Значение | Описание |
n | Выводится, по крайней мере, n символов. Если для вывода требуется меньше символов, то лишние позиции (слева или справа, в зависимости от флагов) заполняются пробелами. |
On | Выводится, по крайней мере, п символов. Если для вывода требуется меньше символов, то лишние позиции слева заполняются нулями. |
* | Ширину поля задает очередной аргумент из списка. |
Спецификатор точности precision определяет максимальное число выводимых символов или место десятичной точки. Он записывается после символа точки (.), чтобы отделить его от предшествующего спецификатора width. Данный спецификатор, как и wiclth, может быть задан или явным образом — десятичным числом, или косвенно — символом звездочки (*). В последнем случае предполагается, что точность задается очередным аргументом из списка.
Отсутствие спецификатора precisionозначает точность по умолчанию и эквивалентно:
Значение | Описание |
1 | для форматов d, i, о, u, x, X |
6 | для форматов e, E, f |
числу значащих цифр | для форматов g, G |
выводу до нулевого символа | для формата s |
не влияет | на формат с |
Возможные значения precision:
. o | Для форматов d, i, о, u, x эквивалентно точности по умолчанию. Для форматов e, E, f означает вывод без десятичной точки |
.n | Задает вывод n символов или позицию n десятичной точки. Если выводимая величина содержит более n символов, то строка символов усекается, а число может округляться (в зависимости от формата) |
* | Точность задает очередной аргумент из списка. |
Ниже приведены сведения о влиянии значения precisionна различные форматы. | |
d, i, о, u, x, X | Указывает, что должно выводиться, по крайней мере, n цифр. Если число имеет менее n цифр, позиции слева заполняются нулями. Если число имеет более n цифр, число не усекается. |
e, E, f | Указывает, что после десятичной точки должно выводиться n цифр. Последняя цифра округляется. |
g, G | Указывает, что должно выводиться доп цифр. |
c | Спецификатор не влияет. |
N | Указывает, что должно выводиться не более n символов. |
Примеры влияния формата:
%f | %e | %g | %#G | |
110000,000000 | 1,100000e+05 | 110000 | 110000, | |
-110000000,000000 | -1,100000e+08 | -1,1e+08 | -1,10000E+08 | |
0,000110 | 1,100000e-04 | 0,00011 | 0,000110000 | |
0,000000 | 1,100000e-07 | 1,1e-07 | 1,10000Е-07 | |
12,000000 | 1,200000e+01 | 12 | 12,0000 | |
0,000000 | 0,000000e+00 | 0 | 0,00000 |
Примеры влияние флагов:
Спецификация | Результат | |||
%6i | 12 -12 | |||
%-6i | 12 -12 | |||
%+6i | + 12 -12 | |||
%06i | 000012 -00012 |
Примеры влияния точности:
%f | 123456789,000000 | 0,123457 | ||
%. 5f | 123456789,00000 | 0,12346 | ||
%.4f | 123456789,0000 | 0,1235 | ||
%.3f | 123456789,000 | 0,123 | ||
%e | 1,234568e+08 | 1,234568e-01 | ||
%. 5e | 1,23457e+08 | 1,23457e-01 | ||
%.4e | 1,2346e+08 | 1,2346e-01 | ||
%.3e | 1,235e+08 | 1,235e-01 | ||
%g | 1,23457e+08 | 0,123457 | ||
%.5g | 1,2346e+08 | 0,12346 | ||
%.4g | 1,235e+08 | 0,1235 | ||
%.3g | 1,23е+08 | 0,123 |
Поделиться
Сертифицированный полный курс веб-разработки для карьерного роста
Узнайте, как создать веб-сайт с нуля, из этого сертифицированного полного курса веб-разработки.
У вас будет преданный наставник с первого дня. Свяжитесь с ним, если вам нужно.
Учитесь в своем собственном темпеПолучите полную дорожную карту, записанные видео и все необходимые ресурсы. Никогда больше не чувствуйте себя потерянным.
Разгадывайте свои сомнения каждую субботуЕсть сомнения? Не беспокойтесь. Просто обратитесь к своему наставнику и запланируйте звонок. Вы также можете присоединиться к сеансу в прямом эфире каждую субботу, чтобы развеять свои сомнения.
Обсудить в сообществе Кодеров!Каждый в codzify ориентирован на достижение цели. Это дает вам возможность взаимодействовать с разработчиками-единомышленниками и обсуждать с ними свои идеи.
Что говорят о нас студенты?У нас обучалось много молодых специалистов, а также учащихся средних школ.
А Анкита Сингхай
«Я прохожу курс по науке о данных в Codzify уже 4 месяца. Он делает свои уроки эффективными, увлекательными и четкими. Кроме того, мы получаем рекомендации и советы по карьере на той же платформе в соответствии с наукой о данных. Это отличный опыт для обучения наука о данных в Codzify, поддерживаемая подходом и методами обучения IIT».
А Айшвария Тхакур
«Я присоединился к codzify, чтобы получить карьерный переход в самую процветающую технологию 20-х годов «Науку о данных». Я изучаю ML уже пару месяцев. Я полностью впечатлен качеством контента и концепций, объясненных в кодзифай. Я рекомендую выбрать курсы в codzify»
«Это отличный опыт в Codzify. Мы учимся программировать на собственном опыте. Мы разрабатываем дизайн веб-сайтов, таких как Facebook, YouTube, Instagram и т. д., для лучшего понимания. Наши сомнения очень хорошо развеяны примерами сэра Маниша. Это отличный способ научиться программировать с Codzify»
М Мрунмайи Боргаонкар
«Я учусь на курсе по науке о данных в Codzify. Преподаватели здесь очень хорошо осведомлены, и каждому студенту уделяется личное внимание. В целом очень приятно учиться с Codzify.»
М Маянк Мальвия
«После прохождения курса машинного обучения в Codzify я чувствую, что открываюсь для мира возможностей и расширяю кругозор.
В профессиональном плане то, что казалось надуманным, теперь кажется возможным. Углубленные занятия в Codzify дали мне уверенность в том, что я умею программировать в Python и решать сложные задачи машинного обучения. Способность преподавателей понимать, «что будет трудно понять студентам», действительно заметна. Я определенно рекомендую учиться с наставниками Codzify. Жажда преподавания здесь завидна. »Б Банмит Сингх Арнеджа
«Я испытываю внимание на личном уровне, которое не только помогает мне направить свои мысли в правильное русло, но также помогает мне сомневаться в логике кода. У меня большой опыт общения с сэром Манишем, который очень нежен, как я я всегда жду моего следующего занятия с ним».
Д Дхайрия Кукреджа
«Теперь я могу создавать веб-страницы, такие как Google, Facebook. В настоящее время изучаю продвинутые вещи курса веб-разработки с сэром Манишем. Я могу в любое время просмотреть записанные видео вместе с живыми уроками. Мне нравится общаться с технологией здесь. »
А Ааруш Метани
«Я хочу больше узнать о веб-сайте и особенно о части базы данных. Я создал свою первую веб-страницу с использованием HTML и CSS. Мне очень понравилось. Bootstrap — это следующее, что я изучаю с Манишем Сэром.»
Прокачай себя!Продолжительность курса: 3 месяца.
Режим обучения: Вы будете получать 3 записанных видео еженедельно в понедельник, среду и пятницу.
Сеансы сомнений в прямом эфире: Каждую субботу 1 час, при необходимости вы можете выбрать сеанс сомнений в реальном времени.
Практические задания: Ежедневные практические задания на основе понятий, которые вы узнали в классе.
Чему вы научитесь: C, C++, Python Языки программирования.
Дорожная карта, чтобы стать квалифицированным веб-разработчиком Full Stack8 часов видео по запросу
Полный пожизненный доступ
Сертификат об окончании
Доступ для мобильных устройств и ТВ
Сеансы сомнений в прямом эфире: Каждую субботу 1 час, при необходимости вы можете выбрать сеанс сомнений в прямом эфире.
Вещи, которые вы узнаете: Angular, HTML, CSS3, Javascript, Bootstrap 5, сценарии на стороне сервера, Firebase с поддержкой Google, аутентификация, способы оплаты и многое другое.
R поставляется с функцией sprintf()
, которая обеспечивает форматирование строк. как в C язык. Если быть более точным, эта функция является оберткой
для одноименной функции библиотеки C. Во многих других программах
языков этот тип печати известен как printf , что означает форматирование печати . Проще говоря, sprintf()
позволяет создавать строки в качестве вывода с использованием форматированных данных.
Функция sprintf()
требует использования специального синтаксиса, который может выглядеть
неудобно при первом использовании. Вот один пример:
sprintf("Я проснулся в %s:%s%s утра", 8, 0, 5) #> [1] "Я проснулся в 8:05 утра."
Как работает sprintf()
? Первым аргументом этой функции является символ
вектор одного элемента, содержащего форматируемый текст. Обратите внимание, что
внутри текста есть различные символы процентов %
, за которыми следует буква с
. Каждый %
называется слотом , который в основном является заполнителем. для переменной, которая будет отформатирована. Остальные входы перешли к sprintf()
— это значения, которые будут использоваться в каждом из слотов.
Строка в предыдущем примере содержит три слота одного типа, %s
,
а последующие аргументы — числа 8
, 0
и 5
. Каждое число используется
как значение для каждого слота. Буква
указывает на то, что отформатированная переменная
указывается как строка .
В большинстве случаев вы не будете использовать sprintf()
, как в примере выше.
Вместо этого вы будете передавать переменные, содержащие разные значения:
час <- 8 мин1 <- 0 мин2 <- 5 sprintf("Я проснулся в %s:%s%s утра", час, мин1, мин2) #> [1] "Я проснулся в 8:05 утра."
Строковый формат %s
— лишь один из большого списка доступных форматов.
параметры. В следующей таблице показаны наиболее распространенные спецификации форматирования:
%s | строка |
%d | целое число |
%0xd | целое число, дополненное ведущими нулями размером x |
%f | десятичная запись с шестью десятичными знаками |
%. xf | число с плавающей запятой с x цифрами после запятой |
%е | компактная научная запись, e в показателе степени |
%Е | компактная экспоненциальная запись, E в показателе |
%г | компактная десятичная или научная запись (с e ) |
Полный синтаксис слота формата определяется следующим образом:
%[параметр][флаги][ширина][.точность][длина]тип
Символ процента, %
, как мы уже говорили, указывает на заполнитель или слот.
Поле параметра
является необязательным полем, которое может принимать значение n$
в котором n
— это номер отображаемой переменной, что позволяет использовать предоставленные переменные. использоваться несколько раз, используя разные спецификаторы формата или в разных
заказы.
sprintf("Второе число %2$d, первое число %1$d", 2, 1) #> [1] "Второе число равно 1, первое число равно 2"
Поле flags
может содержать ноль или более (в любом порядке):
-
(минус) Выровнять по левому краю вывод этого заполнителя. +
(плюс) Добавляет плюс для положительных числовых типов со знаком. ' '
(пробел) Добавляет пробел для положительных числовых типов со знаком. 0
(ноль) Если указан параметр «ширина», перед числовыми типами добавляются нули. #
(решетка) Альтернативная форма: g
и G
нули в конце не удаляются. f, F, e, E, g, G
выходные данные всегда содержат десятичную точку. o, x, X
текст 0
, 0x
, 0X
соответственно
перед ненулевыми числами. Поле ширина
является необязательным полем, которое используется для указания минимального числа
символов для вывода и обычно используется для заполнения полей фиксированной ширины в
табличный вывод, где в противном случае поля были бы меньше, хотя это
не вызывает усечение слишком больших полей.
спринтф("%*д", 5, 10) #> [1] " 10"
Поле точности обычно указывает максимальный предел на выходе, в зависимости от конкретного типа форматирования.
sprintf("%.*s", 3, "abcdef") #> [1] "abc"
Поле length
также является необязательным и может быть любым из:
Наиболее важным полем является поле типа
.
%
: Печатает литерал %
символа (этот тип не принимает никаких флагов,
поля ширины, точности, длины). d, i
: целочисленное значение в виде десятичного числа со знаком. f
: двойное значение в обычном представлении с фиксированной точкой. e, E
: двойное значение в стандартной форме. g, G
: двойное значение в нормальном или экспоненциальном представлении. x, X
: целое число без знака в виде шестнадцатеричного числа. x
использует нижний регистр, а X
использует верхний регистр. o
: целое число без знака в восьмеричной системе счисления. s
: строка с завершающим нулем. a, A
: двойное значение в шестнадцатеричном представлении sprintf()
Давайте начнем с минимального примера, чтобы изучить различные параметры форматирования.
из sprintf()
. Рассмотрим реальную дробь, например 1/6
; в R вывод по умолчанию
этой дроби будет:
1 / 6 #> [1] 0.167
Обратите внимание, что 1/6
печатается с семью десятичными цифрами. Число 1/6
есть
на самом деле иррациональное число, поэтому компьютер должен округлить его до некоторого
количество десятичных цифр. Вы можете изменить формат печати по умолчанию в нескольких
способы. Один из вариантов — отображать только шесть десятичных цифр с опцией %f
:
# печатать 6 десятичных знаков спринтф('%f', 1/6) #> [1] "0.166667"
Но вы также можете указать другое количество десятичных цифр, скажем, 3. Это может
быть достигнуто заданием опции %.3f
:
# вывести 3 десятичных знака спринтф('%.3f', 1/6) #> [1] "0,167"
В таблице ниже показаны шесть различных выходов для 1/6
%s | 0,166666666666667 |
%f | 0,166667 |
%.3f | 0,167 |
%е | 1.666667e-01 |
%Е | 1. 666667E-01 |
%г | 0,166667 |
Когда бы вы использовали sprintf()
? Каждый раз, когда вы производите вывод текста. Некоторый
случаи включают:
При работе над проектами анализа данных обычно создаются разные
файлы с похожими именами (например, для создания изображений, файлов данных или
документы). Представьте, что вам нужно сгенерировать имена 3 файлов данных
(с расширением .csv). Все файлы имеют одинаковое имя префикса, но каждый из них
имеет другое число: data01.csv
, data02.csv
и data03.csv
.
Одно наивное решение для создания вектора символов с этими именами в R было бы
можно написать примерно так:
имена_файлов <- c('data01.csv', 'data02.csv', 'data03. csv')
Вместо записи каждого имени файла вы можете сгенерировать вектор имена_файлов
более эффективным способом, использующим преимущества векторизованной природы paste0()
:
имена_файлов <- paste0('data0', 1:3, '.csv') имена_файлов #> [1] "data01.csv" "data02.csv" "data03.csv"
Теперь представьте, что вам нужно сгенерировать 100 имен файлов, пронумерованных от 01, 02, 03,
до 100. Вы можете написать вектор со 100 именами файлов, но это займет
вы некоторое время. Предпочтительным решением является использование paste0()
, как в подходе
предыдущего примера. Однако в этом случае вам потребуется создать два
отдельные векторы — один с номерами от 01 до 09, а другой с номерами
от 10 до 100, а затем объединить их в один вектор:
files1 <- paste0('data0', 1:9, .csv) files2 <- paste0('данные', 10:100, '.csv') file_names <- c(files1, files2)
Вместо использования paste0()
для создания двух векторов можно использовать sprintf()
с опцией %0xd
, чтобы указать, что целое число должно быть дополнено x
ведущие нули. Например, первые девять имен файлов могут быть сгенерированы как:
sprintf('data%02d.csv', 1:9) #> [1] "data01.csv" "data02.csv" "data03.csv" "data04.csv" "data05.csv" #> [6] "data06.csv" "data07.csv" "data08.csv" "data09.csv"
Для создания 100 имен файлов выполните:
file_names <- sprintf('data%02d.csv', 1:100)
Первые девять элементов в file_names
будут включать начальный ноль перед
целое; следующие элементы не будут включать начальный нуль.
В этом примере используется функция преобразования градусов Фаренгейта в градусах Цельсия. Формула преобразования:
\[ Цельсий = (Фаренгейты - 32) \times \frac{5}{9} \]
Вы можете определить простую функцию to_celsius()
, которая принимает один аргумент, temp
, число, представляющее температуру в градусах Фаренгейта.
Эта функция вернет температуру в градусах Цельсия:
to_celsius <- function(temp = 1) { (темп - 32) * 5/9 }
Вы можете использовать to_celsius()
как любую другую функцию в R. Допустим, вы хотите
узнать, сколько градусов по Цельсию составляют 95 градусов по Фаренгейту:
to_celsius(95) #> [1] 35
Чтобы было интереснее, давайте создадим еще одну функцию, которая не только
вычисляет преобразование температуры, но также выводит более информативное сообщение, например: 95 градусов по Фаренгейту = 35 градусов по Цельсию
.
Назовем эту функцию по Фаренгейту2Цельсия()
:
по Фаренгейту2Цельсия <- function(temp = 1) { Цельсия <- to_celsius(temp) sprintf('%.2f градусов по Фаренгейту = %.2f градусов по Цельсию', temp, celsius) }
Обратите внимание, что по Фаренгейту2Цельсия()
использует to_celsius()
для
вычислить градусы Цельсия. И затем sprintf()
используется с параметрами %.2f
для отображения температуры с двумя десятичными разрядами. Попробуйте:
по Фаренгейту2Цельсия(95) #> [1] "95,00 градусов по Фаренгейту = 35,00 градусов по Цельсию" по Фаренгейту2Цельсия(50) #> [1] "50,00 градусов Фаренгейта = 10,00 градусов Цельсия"
Третий пример немного сложнее. Идея состоит в том, чтобы построить
объект класса "автомобиль"
, который содержит такие характеристики, как имя
автомобиля, его марки, года выпуска и расхода топлива в городе , шоссе и объединены .
В качестве примера рассмотрим Mazda 3 . Один из возможных способов определения
объект "car"
должен использовать список со следующими элементами:
mazda3 <- list( name = 'mazda3', # название автомобиля make = 'mazda', # марка автомобиля год = 2015, # модель года city = 30, # расход топлива в городе шоссе = 40, # расход топлива на шоссе в смешанном режиме = 33) # расход топлива в смешанном цикле (город-шоссе)
Пока у нас есть объект mazda3
, который по сути является списком. Потому что мы
хотим создать метод print()
для объектов класса "автомобиль"
мы
необходимо назначить этот класс нашему mazda3
:
class(mazda3) <- "car"
Теперь, когда у нас есть объект "car"
, мы можем создать функцию print. car()
.
Таким образом, каждый раз, когда мы набираем mazda3
вместо обычного списка
вывод, мы получим настроенный дисплей:
print.car <- function(x) { кошка("Машина\n") кошка(sprintf('имя: %s\n', x$имя)) кошка(sprintf('сделать: %s\n', x$сделать)) кошка(sprintf('год: %s\n', x$год)) невидимый (х) }
В следующий раз, когда вы наберете mazda3
в консоли, R отобразит следующие строки:
mazda3 #> Автомобиль #> имя: mazda3 #> марка: мазда #> year: 2015
Было бы неплохо иметь функцию miles()
, позволяющую вычислять
пройденное расстояние на данном количестве бензина (в галлонах) с учетом
тип расхода топлива (например, город, трасса, смешанный):
миль <- функция (автомобиль, топливо = 1, мили на галлон = 'город') { stopifnot(класс(автомобиль) == 'автомобиль') переключатель (миль на галлон, 'город' = машина $ город * топливо, «шоссе» = автомобиль $ шоссе * топливо, 'комбинированный' = автомобиль $ комбинированный * топливо, машина$город * топливо) }
Функция miles()
принимает три параметра: автомобиль
является объектом
класс "автомобиль"
, топливо
количество галлонов и миль на галлон
тип расхода топлива ( 'город',
шоссе ,
комбинированный’ ). Первая команда проверяет, является ли первый параметр объектом класса
«автомобиль» . Если это не так, то функция остановит выполнение, вызвав ошибку. Вторая команда включает использование функции
switch() для вычисления пройденных миль. Он переключается на соответствующий расход в зависимости от предоставленного значения
миль на галлон . Обратите внимание, что самое последнее условие переключения является условием _безопасности_ на тот случай, если пользователь неправильно укажет
миль на галлон.
Допустим, вы хотите узнать, сколько миль может проехать mazda3
.
проезд с 4 галлонами газа в зависимости от различных видов потребления:
миль (mazda3, топливо = 4, 'город') #> [1] 120 мили(mazda3, топливо = 4, 'шоссе') #> [1] 160 мили(mazda3, топливо = 4, 'комбинированный') #> [1] 132
Опять же, чтобы сделать все более удобным для пользователя, мы собираемся создать функцию get_distance()
, которая выводит более информативное сообщение о
пройденное расстояние:
get_distance <- функция (автомобиль, топливо = 1, мили на галлон = 'город') { расстояние <- миль (автомобиль, топливо = топливо, мили на галлон = мили на галлон) cat(sprintf('%s может проехать %s миль\n', car$name, расстояние)) cat(sprintf('с %s галлонов газа\n', топливо)) cat(sprintf('с расходом %s', миль на галлон)) }
А вот как выглядит вывод при вызове get_distance
:
get_distance(mazda3, 4, 'city') #> Mazda3 может проехать 120 миль #> с 4 галлонами газа #> использование городского потребления
Рассмотрим некоторые кофейные напитки и их цены. Мы поместим эту информацию в такой вектор:
цены <- c( 'американо' = 2, «латте» = 2,75, «мокко» = 3,45, 'капучино' = 3,25)
Какой тип вектора цены
? Это вектор символов? Это числовое
вектор? Или это какой-то вектор с микс-данными? Мы видели, что векторы
представляют собой атомарных структур, а это означает, что все их элементы должны быть
тот же класс. Так цены
это точно не вектор с микс-данными.
Из фрагмента кода видно, что каждый элемент вектора формируется
строкой, за которой следует знак =
, за которым следует некоторое число.
Такой способ определения вектора не очень распространен в R, но он прекрасно
действительный. Каждая строка представляет имя элемента, а
числа являются фактическими элементами. Поэтому цены
на самом деле
числовой вектор. Вы можете убедиться в этом, посмотрев на режим (или тип данных):
режим(цены) #> [1] "numeric"
Допустим, вы хотите перечислить названия сортов кофе и их цены.