{"id":445477,"date":"2025-01-20T03:00:17","date_gmt":"2025-01-20T03:00:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=445477"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-01-20T03:00:17","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=445477","title":{"rendered":"<span>\u041a\u0430\u043a R \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043c\u043e\u044e \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/da7\/369\/8c2\/da73698c23333683f643ef3e20f3272d.png\" width=\"1600\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da7\/369\/8c2\/da73698c23333683f643ef3e20f3272d.png\"\/><\/figure>\n<p>\u041a\u0430\u043a\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043a\u0430\u043a\u0438\u0445\u2011\u043b\u0438\u0431\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041b\u043e\u0433\u0438, \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u00a0\u0411\u0414 \u0438 \u0434\u0430\u0436\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u00a0\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430\u00a0\u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0434\u0430\u043d\u043d\u044b\u0435. \u0418\u043d\u043e\u0433\u0434\u0430\u00a0\u0431\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e\u0439. \u041d\u043e\u00a0\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u00ab\u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430\u00bb \u0438 \u0442\u0435\u043c \u043d\u0443\u0436\u043d\u0435\u0435 \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u00a0\u2014 \u0430\u00a0\u0443\u00a0\u043d\u0430\u0441 \u0432\u00a0\u042f\u043d\u0434\u0435\u043a\u0441 \u0415\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\u00a0\u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e. <\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u00a0\u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0430\u0439\u043f\u043e\u043c (<code>cat data.log | grep \u2026 | awk .. | sort | uniq -c | sort -r | head<\/code>), \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043a\u0443 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e\u00a0\u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0441\u0432\u043e\u0438\u043b\u0441\u044f \u0441\u00a0\u044f\u0437\u044b\u043a\u043e\u043c R \u0438 \u0435\u0433\u043e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e\u00a0\u0443\u00a0\u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f in\u2011memory \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u00a0\u043f\u043e\u043b\u044f\u0445, \u0432\u00a0\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0410\u00a0\u0435\u0449\u0451 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u00a0\u043d\u0435\u0439, \u0438\u043c\u043f\u043e\u0440\u0442 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u00a0\u043b\u044e\u0431\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0445\u043e\u0442\u044c \u0438\u0437\u00a0\u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0441\u00a0\u0443\u0434\u043e\u0431\u043d\u044b\u043c GUI \u0438 \u043c\u043e\u0449\u043d\u044b\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0423\u0437\u043d\u0430\u043b \u044f \u043f\u0440\u043e\u00a0R \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e: \u043d\u0430\u00a0\u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0443\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439\u00a0\u043b\u0438\u0441\u0442 \u0441\u00a0\u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0432\u00a0Excel (\u0441\u043e\u0442\u043d\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0421\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b R \u043a\u0430\u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0438 \u043c\u043e\u0449\u043d\u0443\u044e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043d\u0430\u00a0\u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u044b \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0412\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c \u0438 \u0435\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043d\u0430\u0447\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u0430 \u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b), \u0438 \u0432\u0434\u0440\u0443\u0433 \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b (\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)\u00a0\u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0410\u00a0\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u043a\u00a0\u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u2026<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u043d\u043e\u0432\u043e\u043e\u0431\u0440\u0435\u0442\u0451\u043d\u043d\u043e\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043c\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e R \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u043d\u0435, \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445,\u00a0\u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0430\u00a0\u0432\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043b\u0451\u0433\u043a\u0438\u043c,\u00a0\u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c. \u0412\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0433\u0434\u0435 \u044f \u00ab\u0443\u0432\u0438\u0434\u0435\u043b \u0434\u0430\u043d\u043d\u044b\u0435\u00bb \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439.<\/p>\n<h2>Tidyverse \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c<\/h2>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u00a0R \u0432\u043e\u00a0\u043c\u043d\u043e\u0433\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c <a href=\"https:\/\/www.tidyverse.org\/\">tidyverse<\/a>. \u041e\u043d\u0438 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u00a0\u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u043c: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u00a0\u043d\u0438\u0445 \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437\u00a0\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/magrittr.tidyverse.org\/\">magrittr<\/a>. \u041e\u043d \u0432\u0432\u043e\u0434\u0438\u0442 <a href=\"https:\/\/magrittr.tidyverse.org\/reference\/pipe.html\">pipe\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/a>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>f(g(h(x, 1), 'col'), 'mean')<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u0438\u0437\u044f\u0449\u043d\u043e\u0435 <code>x %&gt;% h(1) %&gt;% g('col') %&gt;% f('mean')<\/code>, \u0433\u0434\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u00a0\u043e\u0442\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u00a0\u0438\u0445 \u0438\u043c\u0451\u043d.<\/p>\n<p>\u0421\u043a\u0430\u0436\u0443 \u0431\u043e\u043b\u044c\u0448\u0435: \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0441\u0430\u043c \u044f\u0437\u044b\u043a R \u0432\u0435\u0440\u0441\u0438\u0438 4.1.0\u00a0\u0431\u044b\u043b \u0432\u0432\u0435\u0434\u0451\u043d \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>|&gt;<\/code> \u0441\u00a0\u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0439\u00a0\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430\u00a0\u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0439\u043f \u0432\u00a0\u0448\u0435\u043b\u043b\u0435 (\u0432\u0438\u0434\u0430 <code>grep \u2026 | cut \u2026 | awk \u2026<\/code>). \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438. <\/p>\n<h3>Tidy Data<\/h3>\n<p>Tidy Data\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u0435. \u041e\u043d \u0434\u043e\u00a0\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442:<\/p>\n<ol>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446\u00a0\u2014 \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/feb\/260\/9ca\/feb2609ca3a610a69da65d9786bf9666.png\" width=\"1600\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/feb\/260\/9ca\/feb2609ca3a610a69da65d9786bf9666.png\"\/><\/figure>\n<p>\u041f\u043e\u043b\u044c\u0437\u0430 \u0435\u0433\u043e \u043d\u0435\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u0442, \u043f\u043e\u00a0\u0441\u0443\u0442\u0438, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 (\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u0430 \u043a\u00a0\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u043c \u0411\u0414), \u0430\u00a0\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f: \u00ab\u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u00a0\u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435? \u0410\u00a0\u0447\u0442\u043e\u00a0\u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435?\u00bb <\/p>\n<p>\u041a\u0430\u043a\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u043d\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u0435\u043d \u0438 \u043f\u0443\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u00a0\u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443.<\/p>\n<h2>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 feature-\u0444\u043b\u0430\u0433\u043e\u0432<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. \u041a\u0430\u043a \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0443 \u043d\u0430\u0441 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441 \u0415\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0447\u0430-\u0444\u043b\u0430\u0433\u043e\u0432. \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438 \u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u043d\u0433\u0435, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u0425\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u0441\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e JSON-\u0444\u0430\u0439\u043b\u0430. \u041f\u0440\u0438\u0447\u0451\u043c \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u0430\u043a\u043e\u0432, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435.<\/p>\n<pre><code class=\"json\">{   \"feature_flag_1\": {      \"description\": \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      \"enabled\": true   },   \"feature_flag_2\": {      \"description\": \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      \"enabled\": false   } }<\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0432\u0430 JSON\u2011\u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c diff \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f: \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0432\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u00a0\u0432\u0430\u0436\u043d\u044b), \u0438\u043b\u0438\u00a0\u0433\u0434\u0435\u2011\u0442\u043e diff \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u0445. \u042d\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0430\u0443\u0437\u0443 \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0431\u044b \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441\u00a0\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u0421\u0440\u0435\u0434\u0438 \u0438\u0434\u0435\u0439 \u043e\u0442\u00a0\u043a\u043e\u043b\u043b\u0435\u0433, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c JSON \u0432\u00a0IPython\u2011\u043d\u043e\u0443\u0442\u0431\u0443\u043a \u0432\u00a0\u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0<code>set<\/code>.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u00a0R \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c. <\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6787935aa080f3d770f38703\" data-style=\"\" id=\"6787935aa080f3d770f38703\" width=\"\"><\/div>\n<pre><code class=\"r\"># (\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0442\u0435\u0441\u0442\u0430) clipboard() %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value) -&gt; test # (\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0434\u0430) clipboard() %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value) -&gt; prod # \u043d\u0430\u0436\u0430\u043b \u0432\u0432\u0435\u0440\u0445 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430  # \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0443, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a False prod %&gt;% full_join(test, by='name') %&gt;% filter(coalesce(enabled.x, F) != coalesce(enabled.y, F)) %&gt;% View<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f RStudio, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: <code>library(tidyverse)<\/code> \u0438 <code>library(jsonlite)<\/code>.<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 R<\/h4>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.<\/p>\n<p>\u041a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u0438\u0434\u0430 <code>a %&gt;% b %&gt;% c %&gt;% d<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. <code>clipboard()<\/code>, \u043a\u0430\u043a\u00a0\u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>parse_json<\/code> \u0438\u0437\u00a0\u043f\u0430\u043a\u0435\u0442\u0430 jsonlite, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 json\u2011\u0442\u0435\u043a\u0441\u0442 \u0432\u00a0list. \u0410\u00a0list \u0432\u00a0\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 JSON.<\/p>\n<p>\u0422\u0430\u043a, \u0438\u0437\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u00a0JSON \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<pre><code class=\"json\">list(feature_flag_1 = list(description = \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      enabled = TRUE), feature_flag_2 = list(description = \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      enabled = FALSE))<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8230;\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>tree<\/code> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/lobstr.r-lib.org\/reference\/tree.html\">lobstr<\/a>.<\/p>\n<pre><code class=\"r\">lobstr::tree(l) #&gt; &lt;list&gt; #&gt; \u251c\u2500feature_flag_1: &lt;list&gt; #&gt; \u2502 \u251c\u2500description: \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #&gt; \u2502 \u2514\u2500enabled: TRUE #&gt; \u2514\u2500feature_flag_2: &lt;list&gt; #&gt;   \u251c\u2500description: \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #&gt;   \u2514\u2500enabled: FALSE<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u00a0tidy\u2011\u0432\u0438\u0434\u0443: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435, \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446\u00a0\u2014 \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f. \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u00bb \u0437\u0434\u0435\u0441\u044c\u00a0\u2014 \u043e\u0434\u0438\u043d \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433, \u0430 \u00ab\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\u00bb\u00a0\u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 enframe. \u041d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443:<\/p>\n<pre><code class=\"r\">&gt; l %&gt;% enframe # A tibble: 2 \u00d7 2   name           value              &lt;chr&gt;          &lt;list&gt;           1 feature_flag_1 &lt;named list [2]&gt; 2 feature_flag_2 &lt;named list [2]&gt;<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u2014 \u043a\u043b\u044e\u0447\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435, \u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<pre><code class=\"r\">list(description = \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\", enabled = TRUE)<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>unnest_wider<\/code>. \u041e\u043d\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c. \u0422\u0430\u043c, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>NA<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"r\">&gt; l %&gt;% enframe %&gt;% unnest_wider(value) # A tibble: 2 \u00d7 3   name           description             enabled   &lt;chr&gt;          &lt;chr&gt;                   &lt;lgl&gt;   1 feature_flag_1 \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 TRUE    2 feature_flag_2 \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435   FALSE <\/code><\/pre>\n<p>\u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u0437\u0430\u043a\u043b\u0438\u043d\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u00a0\u043d\u0435\u043c\u0443 \u043e\u0447\u0435\u043d\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u0448\u044c. \u0427\u0442\u043e\u2011\u0442\u043e \u0442\u0438\u043f\u0430 <code>... %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value)<\/code> \u044f \u043f\u0438\u0448\u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443\u00a0\u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0431\u043e\u0435\u0432\u043e\u0433\u043e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"r\">prod %&gt;%    full_join(test, by='name') %&gt;%    filter(coalesce(enabled.x, F) != coalesce(enabled.y, F)) %&gt;%    View<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 full_join \u0438 filter<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>full_join<\/code> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u043c\u0443 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u0443 <code>name<\/code>, \u0441\u0442\u043e\u043b\u0431\u0446\u044b <code>description<\/code> \u0438 <code>enabled<\/code> \u0440\u0430\u0437\u0434\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f <code>description.x<\/code> \u0438 <code>enabled.x<\/code>, \u0430\u00a0\u0438\u0437\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <code>description.y<\/code> \u0438 <code>enabled.y<\/code>. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0430 FULL, \u0430\u00a0\u043d\u0435\u00a0INNER\u00a0\u2014 \u043e\u043d\u043e \u0438 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u00a0R \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u00a0<code>NA<\/code>. <\/p>\n<pre><code class=\"r\"># A tibble: 3 \u00d7 5   name           description.x           enabled.x description.y              enabled.y   &lt;chr&gt;          &lt;chr&gt;                   &lt;lgl&gt;     &lt;chr&gt;                       &lt;lgl&gt;     1 feature_flag_1 \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435    TRUE      \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435    TRUE      2 feature_flag_2 \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435      FALSE     NA                         NA        3 feature_flag_3 NA                         NA        \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435      TRUE<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u0435 \u0444\u043b\u0430\u0433\u0438, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435 \u0438 \u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>%&gt;% filter(enabled.x != enabled.y)<\/code>, \u043d\u043e, \u043a\u0430\u043a\u00a0\u0438 \u0432\u00a0SQL, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u00a0<code>NA<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0<code>NA<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u00a0\u0431\u0443\u043b\u0435\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u00a0<code>FALSE<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435 \u0444\u043b\u0430\u0433 \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0430\u00a0\u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 (\u0447\u0442\u043e \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0444\u043b\u0430\u0433 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d), \u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 <code>TRUE != NA<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>NA<\/code>. \u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043c\u044b \u043d\u0435\u00a0\u043d\u0430\u0439\u0434\u0451\u043c.<\/p>\n<p>\u041d\u0430\u00a0SQL \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 <code>COALESCE(enabled, FALSE)<\/code>. \u041d\u0430\u00a0R \u043c\u044b \u043f\u0438\u0448\u0435\u043c: <code>coalesce(enabled.x, F)<\/code>, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u00a0FALSE. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0444\u0443\u043d\u043a\u0446\u0438\u044f View \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u00a0\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 RStudio.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 tidyverse \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u00a0\u0442\u043e\u0439\u00a0\u0436\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e\u00a0\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b SQL, \u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u043a\u043e\u0448\u043a\u0430\u043c\u0438, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0443\u0442\u044b. <\/p>\n<h3>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443\u00a0\u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u043d\u044f\u043b. \u0412\u00a0\u0441\u0438\u043b\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043e\u043f\u044f\u0442\u044c\u2011\u0442\u0430\u043a\u0438, \u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0414\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"json\">[{\"author\":\"pupkin\",\"datetime\":\"2024-01-17 16:54:23\",\"value\":{\"feature_flag_1\":{\"description\":\"Enable dark mode\",\"enabled\":true},\"feature_flag_2\":{\"description\":\"Show notifications\",\"enabled\":false}}},{\"author\":\"ivanov\",\"datetime\":\"2024-01-18 09:12:45\",\"value\":{\"feature_flag_1\":{\"description\":\"Enable dark mode\",\"enabled\":false},\"feature_flag_2\":{\"description\":\"Show notifications\",\"enabled\":true},\"feature_flag_3\":{\"description\":\"Enable beta features\",\"enabled\":true}}},{\"author\":\"pupkin\",\"datetime\":\"2024-01-19 11:30:10\",\"value\":{\"feature_flag_1\":{\"description\":\"Enable dark mode\",\"enabled\":true},\"feature_flag_2\":{\"description\":\"Show notifications\",\"enabled\":true},\"feature_flag_3\":{\"description\":\"Enable beta features\",\"enabled\":false},\"feature_flag_4\":{\"description\":\"Allow location access\",\"enabled\":true},\"feature_flag_5\":{\"description\":\"Enable offline mode\",\"enabled\":true}}},{\"author\":\"ivanov\",\"datetime\":\"2024-01-20 14:45:33\",\"value\":{\"feature_flag_1\":{\"description\":\"Enable dark mode\",\"enabled\":false},\"feature_flag_2\":{\"description\":\"Show notifications\",\"enabled\":false},\"feature_flag_3\":{\"description\":\"Enable beta features\",\"enabled\":true},\"feature_flag_4\":{\"description\":\"Allow location access\",\"enabled\":true}}},{\"author\":\"pupkin\",\"datetime\":\"2024-01-21 08:22:17\",\"value\":{\"feature_flag_1\":{\"description\":\"Enable dark mode\",\"enabled\":true},\"feature_flag_2\":{\"description\":\"Show notifications\",\"enabled\":true},\"feature_flag_3\":{\"description\":\"Enable beta features\",\"enabled\":false}}}]<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0435\u0451 \u0432\u00a0list, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<pre><code class=\"r\">clipboard() %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value)<\/code><\/pre>\n<p>&#8230;\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u0438 \u043e\u0442 tidy-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043b\u043e\u0433\u0435, \u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e \u0432 \u0434\u0432\u0443\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432 value. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u2014 \u0441\u0440\u0430\u0437\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439, \u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0421 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c <code>unnest_wider<\/code> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u0438\u0447\u0435\u0439 \u043f\u0430\u043a\u0435\u0442\u0430 <code>jsonlite<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 json-\u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u0437\u0430 \u043d\u0430\u0441:<\/p>\n<pre><code class=\"r\">&gt; clipboard() %&gt;% fromJSON(flatten=T) %&gt;% glimpse Rows: 5 Columns: 12 $ author                           &lt;chr&gt; \"pupkin\", \"ivanov\", \"pupkin\", \"ivanov\", \"pupkin\" $ datetime                         &lt;chr&gt; \"2024-01-17 16:54:23\", \"2024-01-18 09:12:45\", \"2024-01-19 11:30:10\", \"2024-01-20 14:45:33\", \"2024-01-2\u2026 $ value.feature_flag_1.description &lt;chr&gt; \"Enable dark mode\", \"Enable dark mode\", \"Enable dark mode\", \"Enable dark mode\", \"Enable dark mode\" $ value.feature_flag_1.enabled     &lt;lgl&gt; TRUE, FALSE, TRUE, FALSE, TRUE $ value.feature_flag_2.description &lt;chr&gt; \"Show notifications\", \"Show notifications\", \"Show notifications\", \"Show notifications\", \"Show notifica\u2026 $ value.feature_flag_2.enabled     &lt;lgl&gt; FALSE, TRUE, TRUE, FALSE, TRUE $ value.feature_flag_3.description &lt;chr&gt; NA, \"Enable beta features\", \"Enable beta features\", \"Enable beta features\", \"Enable beta features\" $ value.feature_flag_3.enabled     &lt;lgl&gt; NA, TRUE, FALSE, TRUE, FALSE $ value.feature_flag_4.description &lt;chr&gt; NA, NA, \"Allow location access\", \"Allow location access\", NA $ value.feature_flag_4.enabled     &lt;lgl&gt; NA, NA, TRUE, TRUE, NA $ value.feature_flag_5.description &lt;chr&gt; NA, NA, \"Enable offline mode\", NA, NA $ value.feature_flag_5.enabled     &lt;lgl&gt; NA, NA, TRUE, NA, NA <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d glimpse \u0438 flatten=T<\/summary>\n<div class=\"spoiler__content\">\n<p><code>glimpse<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0431\u0435\u0437 \u043d\u0435\u0451 \u0448\u0438\u0440\u043e\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e:<\/p>\n<pre><code class=\"r\">&gt; clipboard() %&gt;% fromJSON(flatten=T)   author            datetime value.feature_flag_1.description value.feature_flag_1.enabled value.feature_flag_2.description value.feature_flag_2.enabled value.feature_flag_3.description 1 pupkin 2024-01-17 16:54:23                 Enable dark mode                         TRUE               Show notifications                        FALSE                             &lt;NA&gt; 2 ivanov 2024-01-18 09:12:45                 Enable dark mode                        FALSE               Show notifications                         TRUE             Enable beta features 3 pupkin 2024-01-19 11:30:10                 Enable dark mode                         TRUE               Show notifications                         TRUE             Enable beta features 4 ivanov 2024-01-20 14:45:33                 Enable dark mode                        FALSE               Show notifications                        FALSE             Enable beta features 5 pupkin 2024-01-21 08:22:17                 Enable dark mode                         TRUE               Show notifications                         TRUE             Enable beta features   value.feature_flag_3.enabled value.feature_flag_4.description value.feature_flag_4.enabled value.feature_flag_5.description value.feature_flag_5.enabled 1                           NA                             &lt;NA&gt;                         NA                             &lt;NA&gt;                           NA 2                         TRUE                             &lt;NA&gt;                         NA                             &lt;NA&gt;                           NA 3                        FALSE            Allow location access                       TRUE              Enable offline mode                         TRUE 4                         TRUE            Allow location access                       TRUE                             &lt;NA&gt;                           NA 5                        FALSE                             &lt;NA&gt;                         NA                             &lt;NA&gt;                           NA<\/code><\/pre>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>flatten=T<\/code> \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043d\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b (\u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u043e \u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441), \u0430 \u043e\u0434\u043d\u0443 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441\u00a0\u043a\u0443\u0447\u0435\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 1200), \u043d\u043e\u00a0\u044d\u0442\u043e\u00a0\u043b\u0438\u0448\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0412\u00a0\u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u0430: \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e\u00a0\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0441\u0445\u043e\u0434\u043d\u044b\u0445 JSON\u2011\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430\u00a0\u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0430\u043c\u0438 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c <code>NA<\/code> (\u043c\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0438\u0445 \u0432\u00a0<code>FALSE<\/code>).<\/p>\n<p>\u0410\u00a0\u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435? \u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u0435\u0434\u044c \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0442\u043e \u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e. \u0417\u043d\u0430\u0447\u0438\u0442, \u043e\u0434\u043d\u0438\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u00ab\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00bb, \u0438 \u0435\u043c\u0443 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430. \u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435: \u043a\u0442\u043e, \u043a\u043e\u0433\u0434\u0430, \u043a\u0430\u043a\u043e\u0439 \u0444\u043b\u0430\u0433 \u0438 \u043d\u0430\u00a0\u043a\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0432\u00a0\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0432\u0438\u0434: \u0443\u0434\u0430\u043b\u0438\u043c\u00a0\u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0441\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0435\u0451 \u0438\u0437 \u00ab\u0448\u0438\u0440\u043e\u043a\u043e\u0439\u00bb \u0432 \u00ab\u0432\u044b\u0441\u043e\u043a\u0443\u044e\u00bb\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u0432 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432\u00a0\u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446.<\/p>\n<pre><code class=\"r\">src %&gt;% fromJSON(flatten=T) %&gt;%   select(-ends_with('.description')) %&gt;%    pivot_longer(ends_with('.enabled'))  # A tibble: 25 \u00d7 4    author datetime            name                         value    &lt;chr&gt;  &lt;chr&gt;               &lt;chr&gt;                        &lt;lgl&gt;  1 pupkin 2024-01-17 16:54:23 value.feature_flag_1.enabled TRUE   2 pupkin 2024-01-17 16:54:23 value.feature_flag_2.enabled FALSE  3 pupkin 2024-01-17 16:54:23 value.feature_flag_3.enabled NA     4 pupkin 2024-01-17 16:54:23 value.feature_flag_4.enabled NA     5 pupkin 2024-01-17 16:54:23 value.feature_flag_5.enabled NA     6 ivanov 2024-01-18 09:12:45 value.feature_flag_1.enabled FALSE  7 ivanov 2024-01-18 09:12:45 value.feature_flag_2.enabled TRUE   8 ivanov 2024-01-18 09:12:45 value.feature_flag_3.enabled TRUE   9 ivanov 2024-01-18 09:12:45 value.feature_flag_4.enabled NA    10 ivanov 2024-01-18 09:12:45 value.feature_flag_5.enabled NA    # \u2139 15 more rows # \u2139 Use `print(n = ...)` to see more rows<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0437\u0430 \u043c\u0430\u0433\u0438\u044f \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pivot_longer<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u00ab\u0432\u044b\u0448\u0435 \u0438 \u0443\u0436\u0435\u00bb, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0432\u00a0\u043e\u0434\u0438\u043d \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u0430\u00a0\u0431\u044b\u0432\u0448\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac0\/d00\/f65\/ac0d00f6528076989d81478072ad3b8a.png\" alt=\"\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f pivot_longer\" title=\"\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f pivot_longer\" width=\"1600\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac0\/d00\/f65\/ac0d00f6528076989d81478072ad3b8a.png\"\/><\/p>\n<div><figcaption>\u041a\u0430\u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>pivot_longer<\/code><\/figcaption><\/div>\n<\/figure>\n<p><code>ends_with<\/code> \u2014 \u043e\u0441\u043e\u0431\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>select<\/code> \u0438 \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e \u043a\u043e\u043d\u0446\u0443 \u0438\u043c\u0435\u043d\u0438, \u0430 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0438\u043d\u0443\u0441, \u0442\u043e \u044d\u0442\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0431\u0443\u0434\u0443\u0442, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/dplyr.tidyverse.org\/reference\/select.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u00a0\u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u00ab\u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c\u00bb, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. <\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0<code>FALSE<\/code> \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u0430\u00a0\u043d\u0435\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0439:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% mutate(value = coalesce(value, F)) %&gt;% type_convert<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>type_convert<\/code> \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u0435\u00a0\u2014 \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u00a0\u0434\u0430\u0442\u044b. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u00a0\u0438\u043c\u0435\u043d\u0438 \u0444\u043b\u0430\u0433\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043d\u0435\u00a0\u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% arrange(datetime) %&gt;% group_by(name) %&gt;% filter(value != lag(value, default=F))\u00a0<\/code><\/pre>\n<p>\u0418\u043b\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 (\u0447\u0442\u043e\u0431\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0444\u043b\u0430\u0433\u0443), \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% arrange(datetime) %&gt;% filter(value != lag(value, default=F), .by=name)<\/code><\/pre>\n<p>\u0418\u043b\u0438\u00a0\u0434\u0430\u0436\u0435 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% filter(value != lag(value, default=F, order_by=datetime), .by=name)<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441\u00a0\u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6787b64012c398d7a8cc8325\" data-style=\"\" id=\"6787b64012c398d7a8cc8325\" width=\"\"><\/div>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0448\u0435\u0448\u044c, \u0434\u0430\u00a0\u044d\u0442\u043e \u0438 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e. \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u043f\u0430\u0440\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439, \u043e\u0446\u0435\u043d\u0438\u043b \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0448\u044c \u043a\u00a0\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u0448\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u00a0\u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u0432\u00a0\u043a\u0430\u043a\u0443\u044e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043d\u0430\u0434 \u043d\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u00a0\u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043a\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u043d\u044f\u043b \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433\u0438.<\/p>\n<pre><code class=\"r\">%&gt;% group_by(author) %&gt;% tally(sort=T)<\/code><\/pre>\n<p>\u0418\u043b\u0438\u00a0\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u043b\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u043e\u0433\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. <\/p>\n<pre><code class=\"r\">%&gt;% group_by(author) %&gt;% summarise(flags = n_distinct(name), changes=n())<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u043c <a href=\"https:\/\/ggplot2.tidyverse.org\/\">ggplot2<\/a>\u00a0(\u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u044c tidyverse) \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% ggplot(aes(x=datetime, color=as.factor(author)) %&gt;% geom_density()<\/code><\/pre>\n<p>\u0418\u043b\u0438\u00a0\u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0435\u0449\u0451\u00a0\u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0435\u0439\u0441\u043e\u0432<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043d\u044f\u043b \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u044f \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c. \u0412\u00a0\u043d\u0438\u0445 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u0438\u043d\u043d\u0430\u044f \u043c\u043e\u0449\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a\u00a0\u0434\u0430\u043d\u043d\u044b\u043c. \u0412\u00a0\u0446\u0435\u043b\u043e\u043c \u043e\u0431\u0449\u0430\u044f \u0442\u0430\u043a\u0442\u0438\u043a\u0430 \u0442\u0430\u043a\u043e\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u00a0tidy\u2011\u0432\u0438\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u00a0\u043d\u0443\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 Feature Flags<\/h3>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u00a0feature flags \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0442\u0430\u043a:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 \u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 (\u0434\u0430, \u044f \u043b\u044e\u0431\u043b\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u043a\u00a0Psalm). \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432\u00a0\u0441\u0435\u0431\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u0439\u043b \u0438 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0433\u0434\u0435 \u043e\u043d \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0444\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0432\u00a0\u043a\u043e\u0434\u0435 \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u00a0\u043f\u0440\u043e\u0434\u0435. \u0422\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u00a0\u0447\u0430\u0441\u0442\u044c \u0444\u043b\u0430\u0433\u043e\u0432 \u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0438 \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435, \u043d\u0438 \u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b \u0438 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 <code>blame<\/code> \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0442\u043e \u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043f\u0440\u044f\u043c\u043e \u0438\u0437\u00a0\u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u00a0\u0448\u0435\u043b\u043b\u2011\u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u00a0\u2014 \u0438 \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u0438\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432\u00a0\u043e\u0434\u043d\u0443 \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441\u00a0\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c <code>%&gt;%<\/code>. \u041f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>blame<\/code>\u00a0\u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430\u044f, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044f \u0442\u0443\u0442\u00a0\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u00a0\u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0438 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u043f\u043e\u00a0\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0444\u043b\u0430\u0433 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0437\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u0451\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0438\u0441\u044c,\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\u2011\u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0427\u0442\u043e\u0431\u044b <code>blame<\/code> \u043f\u043e\u00a0\u0444\u0430\u0439\u043b\u0430\u043c, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433\u0438,\u00a0\u0431\u044b\u043b\u00a0\u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u043f\u043e\u00a0\u0432\u0441\u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0430\u00a0\u043f\u043e\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0441\u00a0\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f\u043c\u0438. \u0412\u00a0\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0442\u0430\u043a\u043e\u0432\u044b\u0445 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u0432\u00a0\u0438\u0434\u0435\u0430\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"r\">arc blame --json -L 100,100 -L 208,208 -L 514,514 File.php<\/code><\/pre>\n<p>Arc\u00a0\u2014 \u044d\u0442\u043e \u043d\u0430\u0448\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439. \u041e\u00a0\u043d\u0435\u0439 \u043c\u044b <a href=\"https:\/\/habr.com\/ru\/companies\/yandex\/articles\/482926\/\"><u>\u043f\u0438\u0441\u0430\u043b\u0438<\/u><\/a> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441\u00a0\u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>system(command, intern=T)<\/code>, \u043d\u043e\u00a0\u043a\u0430\u043a\u00a0\u0435\u0451 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0416\u0438\u0437\u043d\u044c \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/glue.tidyverse.org\/\">glue<\/a>:<\/p>\n<pre><code class=\"r\">ff_usages %&gt;%    mutate(linepart = glue::glue(\"-L {line},{line}\")) %&gt;%   group_by(path) %&gt;%    summarise(lines=str_flatten(linepart, \" \")) %&gt;%    glue::glue_data(\"arc blame --json {lines} {path}\") -&gt; commands<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>glue::glue<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u0430 <code>-L 100,100<\/code> \u043f\u043e\u00a0\u0448\u0430\u0431\u043b\u043e\u043d\u0443. \u0417\u0430\u0442\u0435\u043c, \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u00a0\u043f\u0443\u0442\u0438 \u043a\u00a0\u0444\u0430\u0439\u043b\u0443, \u043e\u043d\u0438 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>str_flatten<\/code>, \u0430\u00a0\u0432\u00a0\u0438\u0442\u043e\u0433\u0435 <code>glue::glue_data<\/code> \u0438\u0437\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\u2011\u043a\u043e\u043c\u0430\u043d\u0434\u0443. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <code>map<\/code> \u0438\u0437\u00a0\u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/purrr.tidyverse.org\/\">purrr<\/a>. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e\u00a0\u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0421\u00a0pipe\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u0438\u0437\u044f\u0449\u043d\u043e:<\/p>\n<pre><code class=\"r\"># \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00bb \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438 \u0431\u0435\u0437 pipe-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 cmds.output &lt;- map(commands, \\(x) system(x, intern=T))  # \u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430 \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435: commands %&gt;% map(system, intern=T) -&gt; cmds.output<\/code><\/pre>\n<p><code>map<\/code> \u0438 <code>str_flatten<\/code> \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0438 \u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434, \u0430\u00a0<code>system<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0439 \u043f\u043e\u00a0\u0441\u0442\u0440\u043e\u043a\u0430\u043c.<\/p>\n<pre><code class=\"r\">cmds.output %&gt;% map(\\(x) x %&gt;% str_flatten %&gt;% parse_json)\u00a0<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c JSON. \u0418\u0437\u00a0\u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0433\u0440\u0430\u0444\u0438\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af8\/1b5\/e45\/af81b5e45157540030c6d6c16a0e0833.png\" alt=\"\u041b\u0438\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u043e\u0442 \u0434\u0430\u0442\u044b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0430-\u0444\u043b\u0430\u0433\u0430 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0435. \u0426\u0432\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0430\" title=\"\u041b\u0438\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u043e\u0442 \u0434\u0430\u0442\u044b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0430-\u0444\u043b\u0430\u0433\u0430 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0435. \u0426\u0432\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0430\" width=\"1113\" height=\"631\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/af8\/1b5\/e45\/af81b5e45157540030c6d6c16a0e0833.png\"\/><\/p>\n<div><figcaption>\u041b\u0438\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u043e\u0442\u00a0\u0434\u0430\u0442\u044b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433\u0430 \u0432\u00a0\u043a\u043e\u0434\u0435 \u0434\u043e\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435. \u0426\u0432\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438, \u043a\u0430\u043a\u0438\u0435 \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433\u0438 \u0432\u00a0\u043f\u0440\u043e\u0434\u0435 \u0432\u0438\u0441\u044f\u0442 \u0434\u043e\u043b\u0433\u043e \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0430\u00a0\u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u0432\u0441\u0435\u00a0\u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u0445 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0438\u043b\u0438\u00a0\u043e\u043d\u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u044b? <\/p>\n<h3>\u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0443 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442<\/h3>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0441\u00a0\u0440\u0430\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f\u00a0\u2014 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442\u00a0\u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430\u00a0\u043e\u0431\u0449\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u00a0RPS \u0438 \u043f\u043e\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0432\u0435\u0442\u0430. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u043e\u0432 nginx. \u041f\u043e\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u2011\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"r\">route_order_cancel:     And:         - Equals: {http_host: \"example.com\"}       - StartsWith: {request_url: \"\/orders\/\"}       - Or:           - EndsWith: {request_url: \"\/cancel\"}           - EndsWith: {request_url: \"\/cancel\/\"}           - Contains: {request_url: \"\/cancel?\"}           - Contains: {request_url: \"\/cancel\/?\"}<\/code><\/pre>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u043c \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043d\u043e\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0435\u043d\u0438\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u0438\u0440\u043e\u0434\u0443 R.<\/p>\n<p>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e YAML\u2011\u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0438 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>yaml::read_yaml<\/code>. \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b symfony <code>debug:route --json<\/code>. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435\u00bb \u0438\u043c\u044f \u0438\u0437\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043c\u0443 \u0438\u043b\u0438\u00a0\u0438\u043d\u043e\u043c\u0443 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443. \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b, \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0442\u0447\u0438\u043d\u0433 \u0432\u0441\u0435\u0433\u043e \u0441\u043e \u0432\u0441\u0435\u043c, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0\u2014 <code>purrr::modify_tree<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u0438 \u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u043a\u0430\u0436\u0434\u044b\u0439 \u00ab\u043b\u0438\u0441\u0442\u00bb \u0441\u00a0\u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u043e\u0443\u0442\u043e\u0432 \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u0431\u0443\u043b\u0435\u0432 \u0432\u0435\u043a\u0442\u043e\u0440, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u00a0\u043b\u0438 \u0440\u043e\u0443\u0442 \u0441\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0432\u0451\u0440\u0442\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432. <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 \u0432\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f R. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u0435\u0433\u043e \u0432\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u0423\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043f\u0440\u043e\u0449\u0435, \u043d\u043e\u00a0\u0441\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043e\u043d \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u043d\u0430\u00a0\u043e\u0442\u043b\u0438\u0447\u043d\u043e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u00a0\u2014 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u0440\u043e\u0443\u0442\u043e\u0432, \u043e\u0442\u0442\u043e\u0433\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0442\u043e\u0440\u043e\u043f\u043b\u0438\u0432\u043e (\u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u00a0\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 ~ \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u043e\u0443\u0442\u043e\u0432 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0442\u0435\u043d \u043f\u0440\u0430\u0432\u0438\u043b), \u043d\u043e\u00a0\u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"r\">monitoring_rule_exec &lt;- function(rule, routes) {   # \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442   handleUrl &lt;- function(clause, fun) {     fun(clause[[1]]) %&gt;% replace_na(FALSE) # \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c NA \u043d\u0430 FALSE   }      handlers &lt;- list(     Equals = function(clause) {       field &lt;- names(clause)[[1]]       expected &lt;- clause[[1]]         # \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 symfony \u0432\u044b\u0434\u0430\u0451\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a, \u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c,       # \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 URL \u0435\u043c\u0443       switch(field,              http_host=stri_detect_regex(expected, routes$hostRegex),              request_url=stri_detect_regex(expected, routes$pathRegex),              request_method=expected == routes$method       ) %&gt;% replace_na(FALSE)     },          StartsWith = function(clause) {       handleUrl(clause, \\(x) stri_startswith(routes$path, fixed=x))     },          EndsWith = function(clause) {       handleUrl(clause, \\(x) stri_endswith(routes$path, fixed=x))     },          Contains = function(clause) {       handleUrl(clause, \\(x) stri_detect(routes$path, fixed=x))     },            Or = function(clause) {       purrr::reduce(clause, `|`)     },          And = function(clause) {       purrr::reduce(clause, `&amp;`)     },          Not = function(clause) {       !clause[[1]]     }    )      rule %&gt;% modify_tree(post = \\(el) {     h &lt;- handlers[[names(el)]]     el[[1]] %&gt;% h %&gt;% return # \u0434\u0430, return \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f   }) }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u00a0\u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u0440\u043e\u0443\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u043d\u0435\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442. \u041f\u043e\u00a0\u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438\u0437\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u043e\u00a0OpenAPI (\u043f\u0430\u043a\u0435\u0442 rapiclient \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u00a0openapi\u2011\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e) \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cec\/b2f\/583\/cecb2f583729da01e45359691bf0dcc0.png\" width=\"923\" height=\"752\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cec\/b2f\/583\/cecb2f583729da01e45359691bf0dcc0.png\"\/><\/figure>\n<p>\u041d\u0430\u00a0\u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u0430, \u0430\u00a0\u0432\u043e\u0442 <code>api_order_integration_order<\/code> \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 RPS. <\/p>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 php-fpm.slow.log<\/h3>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0437\u00a0\u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00a0\u2014 \u0430\u043d\u0430\u043b\u0438\u0437 slow\u2011\u043b\u043e\u0433\u0430 php\u2011fpm. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043e\u043d \u043d\u0435\u00a0\u0441\u043b\u0438\u0448\u043a\u043e\u043c\u2011\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 tidyverse \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0434\u0435\u043b\u043e\u043c. \u0421\u0430\u043c \u043b\u043e\u0433 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 php-fpm.slow.log<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"php\">[08-Dec-2024 16:56:48]  [pool www] pid 3863 script_filename = \/code\/index.php [0x0000000005fbc2d0] realpath() \/code\/includes\/stream_wrappers.inc:377 [0x0000000005fbbdd0] getLocalPath()   \/code\/includes\/stream_wrappers.inc:695 [0x00007ffff7ee1700] url_stat() unknown:0 [0x0000000005fbbb60] file_exists() \/code\/includes\/common.inc:4945 [0x0000000005fbb058] drupal_aggregated_file_exists() \/code\/includes\/common.inc:4994 [0x0000000005fb92c0] drupal_build_js_cache() \/code\/includes\/common.inc:4429 [0x0000000005fb8d80] drupal_get_js() \/code\/includes\/theme.inc:2703 [0x0000000005fb6f60] template_process_html() \/code\/includes\/theme.inc:1125 [0x0000000005fb6010] theme() \/code\/includes\/common.inc:5967 [0x0000000005fb5af0] drupal_render() \/code\/includes\/common.inc:5814 [0x0000000005fb49b8] drupal_render_page() \/code\/includes\/common.inc:2701 [0x0000000005fb4600] drupal_deliver_html_page() \/code\/includes\/common.inc:2589 [0x0000000005fb3f50] drupal_deliver_page() \/code\/includes\/menu.inc:532 [0x0000000005fb3d70] menu_execute_active_handler() \/code\/index.php:21  [08-Dec-2024 16:56:48]  [pool www] pid 3883 script_filename = \/code\/index.php [0x00000000027b95a0] realpath() \/code\/includes\/stream_wrappers.inc:377 [0x00000000027b90a0] getLocalPath() \/code\/includes\/stream_wrappers.inc:695 [0x00007ffff7ee1700] url_stat() unknown:0 [0x00000000027b8e30] file_exists() \/code\/includes\/common.inc:4945 [0x00000000027b8328] drupal_aggregated_file_exists() \/code\/includes\/common.inc:4994 [0x00000000027b6590] drupal_build_js_cache() \/code\/includes\/common.inc:4429 [0x00000000027b6050] drupal_get_js() \/code\/includes\/theme.inc:2703 [0x00000000027b4230] template_process_html() \/code\/includes\/theme.inc:1125 [0x00000000027b32e0] theme() \/code\/includes\/common.inc:5967 [0x00000000027b2dc0] drupal_render() \/code\/includes\/common.inc:5814 [0x00000000027b1c88] drupal_render_page() \/code\/includes\/common.inc:2701 [0x00000000027b18d0] drupal_deliver_html_page() \/code\/includes\/common.inc:2589 [0x00000000027b1220] drupal_deliver_page() \/code\/includes\/menu.inc:532 [0x00000000027b1040] menu_execute_active_handler() \/code\/index.php:21<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u044b\u0441\u043b\u0438\u0442\u044c \u0432\u00a0\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 tidy\u2011data \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: <\/p>\n<ul>\n<li>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u00a0\u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043b\u043e\u0433\u0430. <\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u00a0\u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432\u00a0\u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u00a0\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0414\u043b\u044f\u00a0\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0442\u043e\u0440\u043e\u0435, \u0430\u00a0\u043f\u0435\u0440\u0432\u043e\u0435 \u0431\u0443\u0434\u0435\u0442\u00a0\u043b\u0438\u0448\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u043f\u0438\u0441\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u043c\u044b \u0438\u0445 \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"r\">read_file(\u2018php-fpm.slow.log\u2019) %&gt;%    str_split_1(\"\\n\\n\") %&gt;% str_trim() -&gt; entries<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442\u0434\u0435\u043b\u044f\u0435\u043c \u00ab\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u00bb \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <code>id<\/code>\u00a0\u2014 \u043e\u043d \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u043a\u00a0\u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0440\u0435\u0439\u0441\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>separate_wider_regex<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u00a0\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0435\u0451 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d: \u043c\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u043f\u043e\u00a0\u0447\u0430\u0441\u0442\u044f\u043c, \u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u044b.<\/p>\n<pre><code class=\"r\">entries %&gt;%    enframe(name='id') %&gt;%   separate_wider_regex(value, c(     '\\\\[',     date='.+?', '\\\\]\\\\s+\\\\[pool ',     pool='[^\\\\]]+', '\\\\] pid ',     pid='\\\\d+',     '\\\\nscript_filename = ',     script='.*?', '\\\\n',      trace='(?s).*')) <\/code><\/pre>\n<p>\u00a0\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0435 tidy-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"r\"># A tibble: 2 \u00d7 6      id date                 pool  pid   script          trace                                                                                                        &lt;int&gt; &lt;chr&gt;                &lt;chr&gt; &lt;chr&gt; &lt;chr&gt;           &lt;chr&gt;                                                                                                      1     1 08-Dec-2014 16:56:48 www   3863  \/code\/index.php \"[0x0000000005fbc2d0] realpath() \/code\/includes\/stream_wrappers.inc:377\\n[0x0000000005fbbdd0] getLocalPat\u2026 2     2 08-Dec-2014 16:56:48 www   3883  \/code\/index.php \"[0x00000000027b95a0] realpath() \/code\/includes\/stream_wrappers.inc:377\\n[0x00000000027b90a0] getLocalPat\u2026<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0439\u0441. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;%  separate_longer_delim(trace, regex(\"\\\\n\")) %&gt;%   separate_wider_regex(trace, c(     '\\\\[', address=\".*?\", '\\\\]\\\\s+',     call = '.+?', ' ', file='.+?', ':', line='\\\\d+'   )) %&gt;% type_convert %&gt;%   mutate(date = lubridate::parse_date_time2(date, 'dbYHMS', tz='Europe\/Moscow'))<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0440\u0435\u0439\u0441 \u043f\u043e\u00a0\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>separate_longer_delim<\/code>\u00a0\u2014 \u043d\u0435 \u00ab\u0432\u0448\u0438\u0440\u044c\u00bb (<code>wider<\/code>), \u0430 \u00ab\u0432 \u0434\u043b\u0438\u043d\u0443\u00bb (<code>longer<\/code>), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u044e\u0442\u0441\u044f. \u0417\u0430\u0442\u0435\u043c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>separate_wider_regex<\/code> \u0443\u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0439\u0441 \u043d\u0430\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0434\u0430\u043b\u044c\u0448\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>type_convert<\/code> \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u0442\u0443, \u0441\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0430 \u043d\u0435\u00a0\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c:<\/p>\n<pre><code class=\"r\"># A tibble: 28 \u00d7 9       id date                       pool    pid script          address            call                   file   line    &lt;int&gt; &lt;dttm&gt;                     &lt;chr&gt; &lt;dbl&gt; &lt;chr&gt;           &lt;chr&gt;              &lt;chr&gt;                  &lt;chr&gt; &lt;dbl&gt;  1     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fbc2d0 realpath()             \/cod\u2026   377  2     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fbbdd0 getLocalPath()         \/cod\u2026   695  3     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x00007ffff7ee1700 url_stat()             unkn\u2026     0  4     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fbbb60 file_exists()          \/cod\u2026  4945  5     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fbb058 drupal_aggregated_fil\u2026 \/cod\u2026  4994  6     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fb92c0 drupal_build_js_cache\u2026 \/cod\u2026  4429  7     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fb8d80 drupal_get_js()        \/cod\u2026  2703  8     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fb6f60 template_process_html\u2026 \/cod\u2026  1125  9     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fb6010 theme()                \/cod\u2026  5967 10     1 2014-12-08 16:56:48.000000 www    3863 \/code\/index.php 0x0000000005fb5af0 drupal_render()        \/cod\u2026  5814 # \u2139 18 more rows # \u2139 Use `print(n = ...)` to see more rows<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u00a0\u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043b\u0435\u0433\u043a\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0435\u043b\u043e\u0447\u0438<\/h3>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c R \u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043b\u043e\u0433\u043e\u0432. \u041b\u043e\u0433\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e JSON\u2011\u0441\u0442\u0440\u043e\u043a, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 JSON, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0\u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/ropensci\/jqr\">jqr<\/a> \u0434\u043b\u044f\u00a0\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u00a0\u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u00a0JSON\u2011\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u044b. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441\u0442\u043e\u043b\u044c\u00a0\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"r\">\u2026 %&gt;% mutate(message = map(message, parse_json)) %&gt;% unnest_wider(message)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 R. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0443\u00a0\u0442\u0435\u0445 \u0438\u043b\u0438\u00a0\u0438\u043d\u044b\u0445 EntityManager \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Doctrine \u0432\u00a0YAML. \u0421\u0442\u0440\u043e\u043a \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e, \u0438 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u044d\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u0438, \u0447\u0442\u043e\u00a0\u0445\u0443\u0436\u0435, \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u0421\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>clipboard() %&gt;% yaml::yaml.load %&gt;% \u2026<\/code> \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e\u00a0\u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e\u00a0\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435. <\/p>\n<p>\u041d\u0430\u00a0\u0432\u0445\u043e\u0434\u0435, \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e\u00a0\u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0432\u043e\u0434 strace. \u042f \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b \u0435\u0433\u043e \u0432\u00a0\u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u0441\u00a0\u043e\u0434\u043d\u0438\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u043c (<code>read_file %&gt;% str_split_1(\"\\n\") %&gt;% as_tibble_col<\/code>), \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u043b \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a (<code>separate_wider_regex<\/code>). \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 strace\u00a0\u0431\u044b\u043b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043c\u00a0\u0431\u044b\u043b\u0438 unfinished\u2011\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c \u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>lag\/lead<\/code> \u0434\u043e\u043a\u043b\u0435\u0438\u0442\u044c \u043a\u00a0\u043d\u0430\u0447\u0430\u043b\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043a\u043e\u043d\u0435\u0446 (\u0430 \u0437\u0430\u0442\u0435\u043c \u043a\u043e\u043d\u0446\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c). \u0414\u0430\u043b\u0435\u0435 \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e\u00a0\u0447\u0430\u0441\u0442\u043e\u0442\u0435, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0436\u0438\u0437\u043d\u044c \u0431\u0435\u0437\u00a0R\/RStudio. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0432\u00a0\u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u00a0\u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u00a0\u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u044b \u0432\u00a0\u043b\u0451\u0433\u043a\u0443\u044e \u0438\u00a0\u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<ul>\n<li>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u043d\u0430\u00a0\u0432\u0441\u0451 \u0441\u043c\u043e\u0442\u0440\u044e, \u043a\u0430\u043a\u00a0\u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u044b\u0441\u043b\u044c \u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u00a0\u043c\u043e\u0433. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u00a0tidy\u2011\u0432\u0438\u0434: \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043b\u043e\u0433\u0430 strace \u0438\u043b\u0438\u00a0php\u2011fpm.slow \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430 15\u00a0\u043c\u0438\u043d\u0443\u0442. \u0414\u0443\u043c\u0430\u044e, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0430\u00a0\u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0437\u0430\u043d\u044f\u043b\u043e\u00a0\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u043e\u00a0\u0441\u00a0R \u043d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437. <\/p>\n<\/li>\n<li>\n<p>\u0412\u2011\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u00a0\u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 (<code>clipboard()%&gt;% parse_json %&gt;% \u2026<\/code>) \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0436\u043e\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0438 \u0432\u0441\u044f, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0432\u0435\u0449\u0438 \u0433\u043b\u0430\u0437\u0430\u043c\u0438. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u0432\u0435\u0447\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442 \u0432\u0430\u0441 \u0442\u043e\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c R\/RStudio. \u0410\u00a0\u0435\u0441\u043b\u0438 \u0443\u00a0\u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0442\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u0438\u0445 \u0432\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445\u00a0\u2014 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/873308\/\"> https:\/\/habr.com\/ru\/articles\/873308\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u0430\u043a\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043a\u0430\u043a\u0438\u0445\u2011\u043b\u0438\u0431\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041b\u043e\u0433\u0438, \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u00a0\u0411\u0414 \u0438 \u0434\u0430\u0436\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u00a0\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430\u00a0\u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0434\u0430\u043d\u043d\u044b\u0435. \u0418\u043d\u043e\u0433\u0434\u0430\u00a0\u0431\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e\u0439. \u041d\u043e\u00a0\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u00ab\u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430\u00bb \u0438 \u0442\u0435\u043c \u043d\u0443\u0436\u043d\u0435\u0435 \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u00a0\u2014 \u0430\u00a0\u0443\u00a0\u043d\u0430\u0441 \u0432\u00a0\u042f\u043d\u0434\u0435\u043a\u0441 \u0415\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\u00a0\u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e. <\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u00a0\u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0430\u0439\u043f\u043e\u043c (<code>cat data.log | grep \u2026 | awk .. | sort | uniq -c | sort -r | head<\/code>), \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043a\u0443 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e\u00a0\u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0441\u0432\u043e\u0438\u043b\u0441\u044f \u0441\u00a0\u044f\u0437\u044b\u043a\u043e\u043c R \u0438 \u0435\u0433\u043e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e\u00a0\u0443\u00a0\u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f in\u2011memory \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u00a0\u043f\u043e\u043b\u044f\u0445, \u0432\u00a0\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0410\u00a0\u0435\u0449\u0451 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u00a0\u043d\u0435\u0439, \u0438\u043c\u043f\u043e\u0440\u0442 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u00a0\u043b\u044e\u0431\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0445\u043e\u0442\u044c \u0438\u0437\u00a0\u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0441\u00a0\u0443\u0434\u043e\u0431\u043d\u044b\u043c GUI \u0438 \u043c\u043e\u0449\u043d\u044b\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0423\u0437\u043d\u0430\u043b \u044f \u043f\u0440\u043e\u00a0R \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e: \u043d\u0430\u00a0\u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0443\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439\u00a0\u043b\u0438\u0441\u0442 \u0441\u00a0\u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0432\u00a0Excel (\u0441\u043e\u0442\u043d\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0421\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b R \u043a\u0430\u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0438 \u043c\u043e\u0449\u043d\u0443\u044e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043d\u0430\u00a0\u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u044b \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0412\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c \u0438 \u0435\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043d\u0430\u0447\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u0430 \u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b), \u0438 \u0432\u0434\u0440\u0443\u0433 \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b (\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)\u00a0\u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0410\u00a0\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u043a\u00a0\u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u2026<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u043d\u043e\u0432\u043e\u043e\u0431\u0440\u0435\u0442\u0451\u043d\u043d\u043e\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043c\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e R \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u043d\u0435, \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445,\u00a0\u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0430\u00a0\u0432\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043b\u0451\u0433\u043a\u0438\u043c,\u00a0\u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c. \u0412\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0433\u0434\u0435 \u044f \u00ab\u0443\u0432\u0438\u0434\u0435\u043b \u0434\u0430\u043d\u043d\u044b\u0435\u00bb \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439.<\/p>\n<h2>Tidyverse \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c<\/h2>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u00a0R \u0432\u043e\u00a0\u043c\u043d\u043e\u0433\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c <a href=\"https:\/\/www.tidyverse.org\/\">tidyverse<\/a>. \u041e\u043d\u0438 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u00a0\u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u043c: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u00a0\u043d\u0438\u0445 \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437\u00a0\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/magrittr.tidyverse.org\/\">magrittr<\/a>. \u041e\u043d \u0432\u0432\u043e\u0434\u0438\u0442 <a href=\"https:\/\/magrittr.tidyverse.org\/reference\/pipe.html\">pipe\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/a>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>f(g(h(x, 1), 'col'), 'mean')<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u0438\u0437\u044f\u0449\u043d\u043e\u0435 <code>x %&gt;% h(1) %&gt;% g('col') %&gt;% f('mean')<\/code>, \u0433\u0434\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u00a0\u043e\u0442\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u00a0\u0438\u0445 \u0438\u043c\u0451\u043d.<\/p>\n<p>\u0421\u043a\u0430\u0436\u0443 \u0431\u043e\u043b\u044c\u0448\u0435: \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0441\u0430\u043c \u044f\u0437\u044b\u043a R \u0432\u0435\u0440\u0441\u0438\u0438 4.1.0\u00a0\u0431\u044b\u043b \u0432\u0432\u0435\u0434\u0451\u043d \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>|&gt;<\/code> \u0441\u00a0\u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0439\u00a0\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430\u00a0\u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0439\u043f \u0432\u00a0\u0448\u0435\u043b\u043b\u0435 (\u0432\u0438\u0434\u0430 <code>grep \u2026 | cut \u2026 | awk \u2026<\/code>). \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438. <\/p>\n<h3>Tidy Data<\/h3>\n<p>Tidy Data\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u0435. \u041e\u043d \u0434\u043e\u00a0\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442:<\/p>\n<ol>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446\u00a0\u2014 \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u043b\u044c\u0437\u0430 \u0435\u0433\u043e \u043d\u0435\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u0442, \u043f\u043e\u00a0\u0441\u0443\u0442\u0438, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 (\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u0430 \u043a\u00a0\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u043c \u0411\u0414), \u0430\u00a0\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f: \u00ab\u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u00a0\u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435? \u0410\u00a0\u0447\u0442\u043e\u00a0\u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435?\u00bb <\/p>\n<p>\u041a\u0430\u043a\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u043d\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u0435\u043d \u0438 \u043f\u0443\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u00a0\u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443.<\/p>\n<h2>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 feature-\u0444\u043b\u0430\u0433\u043e\u0432<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. \u041a\u0430\u043a \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0443 \u043d\u0430\u0441 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441 \u0415\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0447\u0430-\u0444\u043b\u0430\u0433\u043e\u0432. \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438 \u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u043d\u0433\u0435, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u0425\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u0441\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e JSON-\u0444\u0430\u0439\u043b\u0430. \u041f\u0440\u0438\u0447\u0451\u043c \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u0430\u043a\u043e\u0432, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435.<\/p>\n<pre><code class=\"json\">{   \"feature_flag_1\": {      \"description\": \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      \"enabled\": true   },   \"feature_flag_2\": {      \"description\": \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      \"enabled\": false   } }<\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0432\u0430 JSON\u2011\u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c diff \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f: \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0432\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u00a0\u0432\u0430\u0436\u043d\u044b), \u0438\u043b\u0438\u00a0\u0433\u0434\u0435\u2011\u0442\u043e diff \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u0445. \u042d\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0430\u0443\u0437\u0443 \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0431\u044b \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441\u00a0\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u0421\u0440\u0435\u0434\u0438 \u0438\u0434\u0435\u0439 \u043e\u0442\u00a0\u043a\u043e\u043b\u043b\u0435\u0433, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c JSON \u0432\u00a0IPython\u2011\u043d\u043e\u0443\u0442\u0431\u0443\u043a \u0432\u00a0\u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0<code>set<\/code>.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u00a0R \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c. <\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6787935aa080f3d770f38703\" data-style=\"\" id=\"6787935aa080f3d770f38703\" width=\"\"><\/div>\n<pre><code class=\"r\"># (\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0442\u0435\u0441\u0442\u0430) clipboard() %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value) -&gt; test # (\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0434\u0430) clipboard() %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value) -&gt; prod # \u043d\u0430\u0436\u0430\u043b \u0432\u0432\u0435\u0440\u0445 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430  # \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0443, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a False prod %&gt;% full_join(test, by='name') %&gt;% filter(coalesce(enabled.x, F) != coalesce(enabled.y, F)) %&gt;% View<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f RStudio, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: <code>library(tidyverse)<\/code> \u0438 <code>library(jsonlite)<\/code>.<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 R<\/h4>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.<\/p>\n<p>\u041a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u0438\u0434\u0430 <code>a %&gt;% b %&gt;% c %&gt;% d<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. <code>clipboard()<\/code>, \u043a\u0430\u043a\u00a0\u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>parse_json<\/code> \u0438\u0437\u00a0\u043f\u0430\u043a\u0435\u0442\u0430 jsonlite, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 json\u2011\u0442\u0435\u043a\u0441\u0442 \u0432\u00a0list. \u0410\u00a0list \u0432\u00a0\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 JSON.<\/p>\n<p>\u0422\u0430\u043a, \u0438\u0437\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u00a0JSON \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<pre><code class=\"json\">list(feature_flag_1 = list(description = \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      enabled = TRUE), feature_flag_2 = list(description = \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\",      enabled = FALSE))<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8230;\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>tree<\/code> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/lobstr.r-lib.org\/reference\/tree.html\">lobstr<\/a>.<\/p>\n<pre><code class=\"r\">lobstr::tree(l) #&gt; &lt;list&gt; #&gt; \u251c\u2500feature_flag_1: &lt;list&gt; #&gt; \u2502 \u251c\u2500description: \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #&gt; \u2502 \u2514\u2500enabled: TRUE #&gt; \u2514\u2500feature_flag_2: &lt;list&gt; #&gt;   \u251c\u2500description: \"\u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #&gt;   \u2514\u2500enabled: FALSE<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u00a0tidy\u2011\u0432\u0438\u0434\u0443: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u00a0\u2014 \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435, \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446\u00a0\u2014 \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f. \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u00bb \u0437\u0434\u0435\u0441\u044c\u00a0\u2014 \u043e\u0434\u0438\u043d \u0444\u0438\u0447\u0430\u2011\u0444\u043b\u0430\u0433, \u0430 \u00ab\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\u00bb\u00a0\u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 enframe. \u041d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443:<\/p>\n<pre><code class=\"r\">&gt; l %&gt;% enframe # A tibble: 2 \u00d7 2   name           value              &lt;chr&gt;          &lt;list&gt;           1 feature_flag_1 &lt;named list [2]&gt; 2 feature_flag_2 &lt;named list [2]&gt;<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u2014 \u043a\u043b\u044e\u0447\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435, \u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<pre><code class=\"r\">list(description = \"\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\", enabled = TRUE)<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>unnest_wider<\/code>. \u041e\u043d\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c. \u0422\u0430\u043c, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>NA<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"r\">&gt; l %&gt;% enframe %&gt;% unnest_wider(value) # A tibble: 2 \u00d7 3   name           description             enabled   &lt;chr&gt;          &lt;chr&gt;                   &lt;lgl&gt;   1 feature_flag_1 \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 TRUE    2 feature_flag_2 \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435   FALSE <\/code><\/pre>\n<p>\u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u0437\u0430\u043a\u043b\u0438\u043d\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u00a0\u043d\u0435\u043c\u0443 \u043e\u0447\u0435\u043d\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u0448\u044c. \u0427\u0442\u043e\u2011\u0442\u043e \u0442\u0438\u043f\u0430 <code>... %&gt;% parse_json %&gt;% enframe %&gt;% unnest_wider(value)<\/code> \u044f \u043f\u0438\u0448\u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443\u00a0\u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0431\u043e\u0435\u0432\u043e\u0433\u043e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"r\">prod %&gt;%    full_join(test, by='name') %&gt;%    filter(coalesce(enabled.x, F) != coalesce(enabled.y, F)) %&gt;%    View<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 full_join \u0438 filter<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>full_join<\/code> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u043c\u0443 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u00a0\u0441\u0442\u043e\u043b\u0431\u0446\u0443 <code>name<\/code>, \u0441\u0442\u043e\u043b\u0431\u0446\u044b <code>description<\/code> \u0438 <code>enabled<\/code> \u0440\u0430\u0437\u0434\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f <code>description.x<\/code> \u0438 <code>enabled.x<\/code>, \u0430\u00a0\u0438\u0437\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <code>description.y<\/code> \u0438 <code>enabled.y<\/code>. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0430 FULL, \u0430\u00a0\u043d\u0435\u00a0INNER\u00a0\u2014 \u043e\u043d\u043e \u0438 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u00a0R \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u00a0<code>NA<\/code>. <\/p>\n<pre><code class=\"r\"># A tibble: 3 \u00d7 5   name           description.x           enabled.x description.y              enabled.y   &lt;chr&gt;          &lt;chr&gt;                   &lt;lgl&gt;     &lt;chr&gt;                       &lt;lgl&gt;     1 feature_flag_1 \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435    TRUE      \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435    TRUE      2 feature_flag_2 \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435      FALSE     NA                         NA        3 feature_flag_3 NA                         NA        \u0417\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435      TRUE<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u0435 \u0444\u043b\u0430\u0433\u0438, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435 \u0438 \u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>%&gt;% filter(enabled.x != enabled.y)<\/code>, \u043d\u043e, \u043a\u0430\u043a\u00a0\u0438 \u0432\u00a0SQL, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u00a0<code>NA<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0<code>NA<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u00a0\u0431\u0443\u043b\u0435\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u00a0<code>FALSE<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435 \u0444\u043b\u0430\u0433 \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0430\u00a0\u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 (\u0447\u0442\u043e \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0444\u043b\u0430\u0433 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d), \u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 <code>TRUE != NA<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>NA<\/code>. \u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043c\u044b \u043d\u0435\u00a0\u043d\u0430\u0439\u0434\u0451\u043c.<\/p>\n<p>\u041d\u0430\u00a0SQL \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 <code>COALESCE(enabled, FALSE)<\/code>. \u041d\u0430\u00a0R \u043c\u044b \u043f\u0438\u0448\u0435\u043c: <code>coalesce(enabled.x, F)<\/code>, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u00a0FALSE. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0444\u0443\u043d\u043a\u0446\u0438\u044f View \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u00a0\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 RStudio.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 tidyverse \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u00a0\u0442\u043e\u0439\u00a0\u0436\u0435<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-445477","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/445477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=445477"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/445477\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=445477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=445477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=445477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}