【问题标题】:dplyr::select Object not found in self-made functiondplyr::select 自制函数中找不到对象
【发布时间】:2020-05-25 15:05:12
【问题描述】:

我正在尝试学习如何使用函数来使我的代码更易于阅读和回忆。我正在练习一个函数,该函数预计将使用filter() 对我的数据进行子集化(根据函数参数之一),仅保留我使用select() 提供给函数的数据的部分列并绘制趋势ggplot() + geom_line() 随时间变化的索引。

我发现了几个相关的问题,但我无法解决其中任何一个问题。我认为我的问题与我在函数本身中包含参数的方式有关。由于我对在 R 中编写函数(在某种程度上,对 R 本身)还很陌生,所以我想了解我缺少什么。

下面是我用dput()获得的数据样本:

structure(list(denominazione_regione = c("Abruzzo", "Abruzzo", 
"Abruzzo", "Abruzzo", "Abruzzo", "Abruzzo", "Abruzzo", "Abruzzo", 
"Abruzzo", "Abruzzo", "Basilicata", "Basilicata", "Basilicata", 
"Basilicata", "Basilicata", "Basilicata", "Basilicata", "Basilicata", 
"Basilicata", "Basilicata", "Calabria", "Calabria", "Calabria", 
"Calabria", "Calabria", "Calabria", "Calabria", "Calabria", "Calabria", 
"Calabria", "Campania", "Campania", "Campania", "Campania", "Campania", 
"Campania", "Campania", "Campania", "Campania", "Campania", "Emilia-Romagna", 
"Emilia-Romagna", "Emilia-Romagna", "Emilia-Romagna", "Emilia-Romagna", 
"Emilia-Romagna", "Emilia-Romagna", "Emilia-Romagna", "Emilia-Romagna", 
"Emilia-Romagna", "Friuli Venezia Giulia", "Friuli Venezia Giulia", 
"Friuli Venezia Giulia", "Friuli Venezia Giulia", "Friuli Venezia Giulia", 
"Friuli Venezia Giulia", "Friuli Venezia Giulia", "Friuli Venezia Giulia", 
"Friuli Venezia Giulia", "Friuli Venezia Giulia", "Lazio", "Lazio", 
"Lazio", "Lazio", "Lazio", "Lazio", "Lazio", "Lazio", "Lazio", 
"Lazio", "Liguria", "Liguria", "Liguria", "Liguria", "Liguria", 
"Liguria", "Liguria", "Liguria", "Liguria", "Liguria", "Lombardia", 
"Lombardia", "Lombardia", "Lombardia", "Lombardia", "Lombardia", 
"Lombardia", "Lombardia", "Lombardia", "Lombardia", "Marche", 
"Marche", "Marche", "Marche", "Marche", "Marche", "Marche", "Marche", 
"Marche", "Marche", "Molise", "Molise", "Molise", "Molise", "Molise", 
"Molise", "Molise", "Molise", "Molise", "Molise", "P.A. Bolzano", 
"P.A. Bolzano", "P.A. Bolzano", "P.A. Bolzano", "P.A. Bolzano", 
"P.A. Bolzano", "P.A. Bolzano", "P.A. Bolzano", "P.A. Bolzano", 
"P.A. Bolzano", "P.A. Trento", "P.A. Trento", "P.A. Trento", 
"P.A. Trento", "P.A. Trento", "P.A. Trento", "P.A. Trento", "P.A. Trento", 
"P.A. Trento", "P.A. Trento", "Piemonte", "Piemonte", "Piemonte", 
"Piemonte", "Piemonte", "Piemonte", "Piemonte", "Piemonte", "Piemonte", 
"Piemonte", "Puglia", "Puglia", "Puglia", "Puglia", "Puglia", 
"Puglia", "Puglia", "Puglia", "Puglia", "Puglia", "Sardegna", 
"Sardegna", "Sardegna", "Sardegna", "Sardegna", "Sardegna", "Sardegna", 
"Sardegna", "Sardegna", "Sardegna", "Sicilia", "Sicilia", "Sicilia", 
"Sicilia", "Sicilia", "Sicilia", "Sicilia", "Sicilia", "Sicilia", 
"Sicilia", "Toscana", "Toscana", "Toscana", "Toscana", "Toscana", 
"Toscana", "Toscana", "Toscana", "Toscana", "Toscana", "Umbria", 
"Umbria", "Umbria", "Umbria", "Umbria", "Umbria", "Umbria", "Umbria", 
"Umbria", "Umbria", "Valle d'Aosta", "Valle d'Aosta", "Valle d'Aosta", 
"Valle d'Aosta", "Valle d'Aosta", "Valle d'Aosta", "Valle d'Aosta", 
"Valle d'Aosta", "Valle d'Aosta", "Valle d'Aosta", "Veneto", 
"Veneto", "Veneto", "Veneto", "Veneto", "Veneto", "Veneto", "Veneto", 
"Veneto", "Veneto"), mese = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 4, 
4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 
4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 
5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5), giorno = c(13, 14, 15, 17, 18, 
19, 20, 21, 22, 24, 2, 3, 5, 7, 8, 9, 10, 11, 12, 15, 3, 4, 5, 
6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 14, 15, 16, 14, 
15, 16, 17, 18, 19, 20, 21, 22, 23, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 22, 23, 24, 25, 26, 27, 28, 29, 4, 6, 4, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 
30, 31, 1, 2, 3, 4, 5, 6, 7, 8, 27, 1, 2, 3, 5, 6, 7, 19, 16, 
17, 3, 4, 7, 8, 9, 10, 11, 5, 6, 17, 6, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 20, 22, 23, 25, 27, 29, 30, 2, 3, 17, 3, 4, 5, 15, 
16, 17, 20, 21, 22, 23, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 6, 9, 10, 11, 12, 13, 14, 15, 
16, 17, 23, 24, 25, 26, 27, 28, 29, 31, 1, 2, 7, 8, 9, 10, 29, 
30, 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16, 17), indice_covid = c(0.000722977172570487, 
0.000731747419143323, 0.000726619405602403, 0.000705958713917565, 
0.000715143109836991, 0.000715066255966087, 0.000719508897665411, 
0.000712522957044176, 0.000708704722548377, 0.000704215366199546, 
0.000194231162135417, 0.000204103477007972, 0.000195833844109375, 
0.000196535072992117, 0.000195721206888281, 0.000204300911935104, 
0.000204788965105557, 0.000204686490106934, 0.000202443676947922, 
0.00019709033540664, 0.000191329551016342, 0.00019013015559816, 
0.000195445031690215, 0.000195653677128041, 0.000196745165065935, 
0.00019636132340351, 0.000194665566928984, 0.000198970510972297, 
0.000198872792842392, 0.000192711132430227, 0.000247190709193111, 
0.000253340604775297, 0.000257958192196345, 0.00026256767163786, 
0.000259478621064338, 0.000251187148507711, 0.000250203862942052, 
0.000245759340550998, 0.000251713424290707, 0.000250221080333117, 
0.00230641037054345, 0.0023030137614792, 0.00230321555195822, 
0.00230574274068461, 0.0022955317181813, 0.0022916164249754, 
0.00230260915349491, 0.00229883442609974, 0.00229607273678057, 
0.00229384641965863, 0.00102605677984233, 0.00103412261154359, 
0.00103905893583055, 0.00104611267918566, 0.00105462027451819, 
0.00106128028669706, 0.00112457383848192, 0.0010657720577344, 
0.00108146179292638, 0.00109006764207304, 0.000451787709373674, 
0.000451301708327933, 0.000453740362866175, 0.000458679513230127, 
0.000452522184585961, 0.000450469304561494, 0.000452388493645777, 
0.000451646379485777, 0.00044759030746637, 0.000453176465305298, 
0.00223742214827426, 0.00224570252927823, 0.00224596373110458, 
0.00226551056338028, 0.00225429956663055, 0.00226734839808079, 
0.00227926554196977, 0.00227752561522984, 0.0022828723494815, 
0.00229510317675282, 0.00419441077616446, 0.0042509108406737, 
0.00429653658926419, 0.00424793326504034, 0.00419551867716494, 
0.00422845831162317, 0.0042308249300686, 0.00420821551831933, 
0.00421728969042919, 0.0041844763767952, 0.00172290368072297, 
0.00178077393459916, 0.00184618380602529, 0.00188901900711415, 
0.0020071335192238, 0.00180186353769265, 0.00183252911777645, 
0.00184365144948012, 0.0018222985489136, 0.00169241476432713, 
0.000250794294819987, 0.000266834076638407, 0.000265165223138765, 
0.000269318035318716, 0.000276757902865351, 0.000272940706832408, 
0.000274233141481004, 0.000254959475421852, 0.000256973597672904, 
0.000265933897656217, 0.00160390744722108, 0.00161006319915358, 
0.00178213145122727, 0.00166885475302064, 0.0016547681756398, 
0.00161459333782649, 0.00160615142193389, 0.00160337890499983, 
0.00161225818840389, 0.00160400366732056, 0.00258365467992859, 
0.00257701229721788, 0.00259178457506773, 0.00262120887528692, 
0.00263828178998998, 0.00266783466211296, 0.00267901572358427, 
0.00269823185448847, 0.00270825410554096, 0.00272187052992249, 
0.00195370953028712, 0.00196262152333827, 0.00194005431082411, 
0.00194421363849008, 0.00194744414088127, 0.00194429612391499, 
0.00196104010507744, 0.00195441352344111, 0.00194683393834275, 
0.00195880684904024, 0.000330009885697706, 0.00034406841508414, 
0.000337786303630158, 0.000324351196174386, 0.000324488151434096, 
0.000324569103459299, 0.000328843946704101, 0.000337401985032215, 
0.000336483436678545, 0.000329547072227643, 0.000230483882870789, 
0.000230103422133935, 0.000230301910659427, 0.000231314894995154, 
0.000228620918265592, 0.000229279094603471, 0.000234826014536552, 
0.000234719487969866, 0.00023808566892597, 0.000239411792331136, 
0.000223062270757503, 0.000226287613069965, 0.00023061526741283, 
0.000230070197530306, 0.000226959363714129, 0.000226174506604244, 
0.000226413235808541, 0.000223216642122798, 0.000224058198468727, 
0.000224589546052104, 0.000705847037288575, 0.000697185576306138, 
0.000727218324766378, 0.000710302680606525, 0.000713471918610933, 
0.000718929784394798, 0.000733704525448964, 0.000725081910028338, 
0.000726996512532976, 0.000697427167923133, 0.000471752986060328, 
0.000496763433728451, 0.000528989540994201, 0.000549981803030561, 
0.00048950494039217, 0.000527332301604848, 0.000487397674642721, 
0.000460909394964938, 0.000460726234814601, 0.000463354614150553, 
0.00313132661181226, 0.00325238521159263, 0.00321473031687171, 
0.00328710836662263, 0.0031429102541658, 0.00315969283656677, 
0.00312271481546321, 0.00310642552480385, 0.00313066183374978, 
0.00314310505626025, 0.00119011081454931, 0.00120503266098013, 
0.00121702131779706, 0.00123403843449071, 0.0011908796837411, 
0.00120040745199511, 0.0012181362510992, 0.00123036198182824, 
0.00124443699302914, 0.00125054297376155), indice_covid_mobile = c(103.912846159121, 
101.213073787884, 99.2992098903576, 100.491596517356, 101.300982017554, 
99.9892533578459, 100.621290917066, 99.0290682097327, 99.4641247053094, 
100.26158538902, 115.9226525617, 105.082765692187, 103.08766970886, 
101.462864409105, 99.5858926900704, 104.383635878416, 100.238889374419, 
99.9499606833941, 98.9042690810515, 102.34133298302, 107.567889175972, 
99.3731258910028, 102.795388283008, 100.106754024915, 100.557867326552, 
99.8049041447617, 99.1364101417053, 102.211456351129, 99.9508881344138, 
96.901707707676, 103.716272968089, 102.487915343687, 101.822679560248, 
101.786909499663, 98.8235221212675, 96.8045642748461, 99.6085446363396, 
101.58668799582, 102.42272937678, 99.4071257972055, 101.154089070817, 
99.8527317988322, 100.008762017943, 100.109724368796, 99.5571482315378, 
99.8294385054715, 100.479693215658, 99.8360673851472, 99.8798656707148, 
99.9030380402904, 100.114688083845, 100.78609993713, 100.477344198053, 
100.678858831956, 100.81325802677, 100.631508073549, 105.96388650371, 
94.7711943195391, 101.472147358163, 100.795760812166, 100.991174693634, 
99.8924271210442, 100.540360138958, 101.088541105921, 98.6575967605781, 
99.5463470975805, 100.426042144237, 99.835956446633, 100.8372802469, 
101.781618493555, 100.393749520538, 100.492053705944, 100.011631185473, 
100.870309346718, 99.5051448035183, 100.578841944673, 100.52559826708, 
99.9236628331413, 100.234760663762, 100.535764834775, 101.600857776282, 
101.347032217977, 101.07331699724, 98.868778998757, 98.7661155530205, 
101.614006396929, 100.055968825303, 99.4656027577841, 100.215629928419, 
99.2219336103835, 103.98400560808, 103.358879229506, 103.673114826945, 
102.320202406123, 106.252690505751, 89.7729782515648, 101.701881382375, 
100.606938880031, 98.8418146731291, 92.8725298791513, 106.587311983887, 
108.53430496759, 99.3745725730888, 101.566122484236, 111.232519873583, 
98.6207454264458, 100.473522129988, 102.906353573357, 103.411157299569, 
103.486856262455, 104.116548061971, 100.383797203708, 118.44082353111, 
93.6437518046932, 99.1559135176178, 97.5721772750567, 99.4771490941511, 
100.519560604868, 100.553785719418, 100.807425857845, 100.463909136803, 
100.006603916455, 100.573232726355, 101.13529112343, 100.651337436861, 
101.120156013475, 100.419106237358, 100.717283244553, 100.371437726369, 
100.502774992704, 102.942338632398, 101.58152104801, 98.850149545095, 
100.736612990071, 100.625871301234, 100.528946833558, 100.861184721633, 
100.893960560723, 99.6121810964031, 101.284060427294, 106.306911726141, 
104.260032803778, 98.1741679333031, 100.882266971771, 100.042224373249, 
100.024947605897, 102.379257946514, 102.602461871014, 99.7277584618886, 
97.9385718003325, 101.294692780857, 99.8349295698616, 100.086260570856, 
100.439850599948, 98.8353639182557, 100.287889814665, 102.419287263269, 
99.9546359602037, 101.434129302692, 100.556994216052, 105.32505410048, 
101.445938078864, 101.912457462498, 99.763645361108, 98.6478762353532, 
99.6541860635133, 100.105550889833, 98.5881595330206, 101.035932860823, 
100.237147128295, 103.205110035867, 100.125355196867, 104.307712247772, 
97.6739249295887, 100.446181338032, 100.764972753867, 102.055102094094, 
98.8247836667833, 100.264053271521, 95.9326703636007, 112.11597059997, 
105.301598168353, 106.487214049528, 103.968369960001, 89.0038429807777, 
107.727677106256, 92.4270470743795, 101.052848336138, 99.9602611375818, 
100.57048614499, 103.394635772503, 103.866048317148, 98.8422375496386, 
102.251450125414, 102.180770080942, 100.533982234419, 98.829695700936, 
99.4783612458395, 100.780199259645, 100.397463002114, 100.329554145308, 
101.253819917305, 100.994882313579, 101.398259541127, 101.362276408612, 
100.800061365064, 101.476898454323, 101.003642303397, 101.143973189093, 
100.490662103956), indice_covid_fisso = c(8966.958396573, 9075.73421845227, 
9012.13237067192, 8755.88145458328, 8869.79389778578, 8868.84069277578, 
8923.94199444909, 8837.29660467997, 8789.93971545696, 8734.25902022251, 
14274.0922562703, 14999.6109203431, 14391.8737188443, 14443.4071888342, 
14383.5959838623, 15014.1204580173, 15049.9875964539, 15042.4566855114, 
14877.6318366388, 14484.2135498949, 16593.1915765469, 16489.1731546972, 
16950.1095690285, 16968.204493221, 17062.8645619911, 17029.5756204458, 
16882.509932477, 17255.8592706088, 17247.384596198, 16713.0102086266, 
7839.21256089349, 8034.24553302023, 8180.68408417076, 8326.8655052082, 
8228.90177454762, 7965.9525074559, 7934.76935909882, 7793.81925677153, 
7982.64240547845, 7935.31537795503, 1227.93003521849, 1226.12168474402, 
1226.22911774605, 1227.57458990548, 1222.13825412489, 1220.05375685345, 
1225.90627195246, 1223.8966117452, 1222.42629175954, 1221.24100327104, 
8859.45292261082, 8929.0970764655, 8971.71960329855, 9032.62491420386, 
9106.08346134662, 9163.58911358911, 9710.0951679899, 9202.37316026789, 
9337.84565363512, 9412.15257004731, 3476.06853467991, 3472.32922768268, 
3491.09231072248, 3529.09428557033, 3481.71960955858, 3465.92468749571, 
3480.69098735194, 3474.98113817457, 3443.77359527659, 3486.75366554139, 
6238.09607545619, 6261.18238140163, 6261.91063113719, 6316.40862464312, 
6285.15154833305, 6321.53264178107, 6354.75850779916, 6349.90746519359, 
6364.81455010715, 6398.91498826526, 1323.27161169467, 1341.09650663555, 
1355.49072339066, 1340.15712765777, 1323.62113729451, 1334.01308159951, 
1334.75971305066, 1327.62679395391, 1330.48955465938, 1320.13746261722, 
1414.1362338993, 1461.63536213666, 1515.32290733917, 1550.48146589578, 
1647.42827330727, 1478.94542550627, 1504.11532235845, 1513.24438305035, 
1495.71820864616, 1389.11134023281, 771.75264686781, 821.110803449613, 
815.975351279508, 828.75452472172, 851.648735595149, 839.902331458836, 
843.879454868576, 784.569880834311, 790.767805629534, 818.340742381602, 
7780.1187710493, 7809.97864933774, 8644.63493837713, 8095.16048611568, 
8026.83033072523, 7831.95311986324, 7791.00368203037, 7777.55495649506, 
7820.62594516405, 7780.58550858044, 11646.7962800509, 11616.85323896, 
11683.4448434984, 11816.0859557175, 11893.0485471188, 12026.2692456048, 
12076.6720901345, 12163.2960355366, 12208.4751057826, 12269.856265605, 
3745.51871273691, 3762.60417821855, 3719.33985695903, 3727.31383638831, 
3733.50713532563, 3727.47197182132, 3759.57239094578, 3746.86836041536, 
3732.33729662078, 3755.29094472873, 7279.55022764552, 7589.66145531074, 
7451.08698270595, 7154.72755901373, 7157.74859788319, 7159.53428479451, 
7253.83126638358, 7442.60945927894, 7422.34758481137, 7269.34121862073, 
14716.6217521341, 14692.328961306, 14705.0026481401, 14769.6826905103, 
14597.6696367375, 14639.6948408, 14993.871113465, 14987.0692878061, 
15202.0032400773, 15286.6775188485, 13562.5240475235, 13758.6297471818, 
14021.7576885192, 13988.6166137682, 13799.4732041881, 13751.7527026863, 
13766.2678000316, 13571.910060438, 13623.0779614024, 13655.3846995732, 
3709.28719515099, 3663.770468982, 3821.5951582046, 3732.70198593756, 
3749.35660560317, 3778.03816208134, 3855.68070346596, 3810.36811408214, 
3820.42951574437, 3665.04005381276, 3335.56624585953, 3512.40456485421, 
3740.2617672617, 3888.6891916591, 3461.08282215474, 3728.54412703095, 
3446.18323547991, 3258.89579011162, 3257.60074199724, 3276.18490288943, 
32348.8642996309, 33599.4870235032, 33210.484779231, 33958.2022804436, 
32468.5316869857, 32641.9078779708, 32259.8982267784, 32091.6180955748, 
32341.9966623645, 32470.5441332424, 1721.88218494195, 1743.47148672928, 
1760.81697619303, 1785.43776756444, 1722.99460417864, 1736.77961832881, 
1762.4300896669, 1780.11858361459, 1800.48266294519, 1809.31694906057
)), row.names = c(NA, -210L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), groups = structure(list(denominazione_regione = c("Abruzzo", 
"Basilicata", "Calabria", "Campania", "Emilia-Romagna", "Friuli Venezia Giulia", 
"Lazio", "Liguria", "Lombardia", "Marche", "Molise", "P.A. Bolzano", 
"P.A. Trento", "Piemonte", "Puglia", "Sardegna", "Sicilia", "Toscana", 
"Umbria", "Valle d'Aosta", "Veneto"), .rows = list(1:10, 11:20, 
    21:30, 31:40, 41:50, 51:60, 61:70, 71:80, 81:90, 91:100, 
    101:110, 111:120, 121:130, 131:140, 141:150, 151:160, 161:170, 
    171:180, 181:190, 191:200, 201:210)), row.names = c(NA, -21L
), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

功能

我正在练习的函数有 3 个参数:数据集(我称之为 data.moving)和 2 个附加条目:一个根据 denominazione_regione 列对数据进行子集化,第二个用于选择要绘制的索引随着时间的推移(我提供给函数的 data.frame 有 3 个可能的索引)

plot_by_reg <- function(df, reg, dato) {

  #d <- 
    df %>% 
    dplyr::filter(denominazione_regione == reg) %>%
    dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" )  , format = "%m-%d" ), "%m-%d")) %>%
    dplyr::select(c(denominazione_regione, calendario, all_of(dato))) %>%
    ggplot(aes(x=df$calendario, y=df$dato)) + #, group = 1)) +
    geom_line(aes(group = 1)) +
    theme_dark()
}

问题

当我调用该函数时,R 返回以下错误>

plot_by_reg(df = data.moving, reg = "Toscana", dato = "indice_covid")
Errore: geom_line requires the following missing aesthetics: x and y
Run `rlang::last_error()` to see where the error occurred.

相反,如果我更改 ggplot() 美学以调用函数参数(包含在函数调用中的引号 "" 中(我会得到一个图表,其中线是水平的并且在 y 轴上没有实际值

plot_by_reg <- function(df, reg, dato) {

  #d <- 
    df %>% 
    dplyr::filter(denominazione_regione == reg) %>%
    dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" )  , format = "%m-%d" ), "%m-%d")) %>%
    dplyr::select(c(denominazione_regione, calendario, all_of(dato))) #%>%
    ggplot(aes(x = calendario, y = dato) + #, group = 1)) +
    geom_line(aes(group = 1)) +
    theme_dark()
}

最后,如果我修改 plot_by_reg 删除 ggplot() 部分,该功能可以工作,打印一个带有 3 列的 data.frame


plot_by_reg <- function(df, reg, dato) {

  #d <- 
    df %>% 
    dplyr::filter(denominazione_regione == reg) %>%
    dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" )  , format = "%m-%d" ), "%m-%d")) %>%
    dplyr::select(c(denominazione_regione, calendario, all_of(dato))) #%>%
    #ggplot(aes(x=df$calendario, y=df$dato)) + #, group = 1)) +
    #geom_line(aes(group = 1)) +
    #theme_dark()
}

我认为问题在于我在其中调用函数参数的方式,但就我尝试更改它而言,我总是发现错误。例如,如果我尝试传递参数dato,不带“”,R 会在select() 行中抛出错误Error in plot_by_reg(df = data.moving, reg = Toscana, dato = indice_covid) : object "indice_covid" not found,因为它没有找到元素df$dato。函数外的相同命令可以完美运行。

编辑

我忘了提及我正在使用的机器的功能:

Sys.info()
          sysname           release           version          nodename           machine             login 
        "Windows"          "10 x64"     "build 18362" "DESKTOP-7D7TTKL"          "x86-64"         "Filippo" 
             user    effective_user 
        "Filippo"         "Filippo" 

R.version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          6.2                         
year           2019                        
month          12                          
day            12                          
svn rev        77560                       
language       R                           
version.string R version 3.6.2 (2019-12-12)
nickname       Dark and Stormy Night     

library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0     v purrr   0.3.3
v tibble  2.1.3     v dplyr   0.8.4
v tidyr   1.0.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
Warning messages:
1: package ‘tidyverse’ was built under R version 3.6.3 
2: package ‘ggplot2’ was built under R version 3.6.3 

【问题讨论】:

    标签: r function ggplot2 dplyr


    【解决方案1】:

    您的函数存在两个问题。出现第一个错误是因为calendario 不是传递给函数的df 的列。指定美学时只需删除df$。第二。即使在删除 df$ 时,您也将 y-aesthetic 设置为等于变量 dato 中的字符串,即您的示例中的“indice_covid”。也就是说,对于每个日期,您都具有相同的值“indice_covid”。这就是为什么你得到一条平坦的线。要告诉 ggplot2 您想要 df 的列 dato,您必须使用 sym 和 bang-bang-operator !! 将其转换为符号,即 !!sym(dato)。试试这个:

    library(ggplot2)
    library(dplyr)
    
    plot_by_reg <- function(df, reg, dato) {
    
      df %>% 
        dplyr::filter(denominazione_regione == reg) %>%
        dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" )  , format = "%m-%d" ), "%m-%d")) %>%
        dplyr::select(c(denominazione_regione, calendario, all_of(dato))) %>%
        #ggplot(aes(x=df$calendario, y=df$dato)) +
        ggplot(aes(x = calendario, y = !!sym(dato))) +
        geom_line(aes(group = 1)) +
        theme_dark()
    }
    
    plot_by_reg(df = data.moving, reg = "Toscana", dato = "indice_covid")
    

    reprex package (v0.3.0) 于 2020-05-25 创建

    【讨论】:

    • 嗨@stefan,非常感谢。有效!对不起,如果我一直问,但我还有两个好奇:首先,你说calendario 不是df 的一部分,但我在函数中创建了它。这意味着一个函数只将原始列视为数据的一部分?其次,关于sys() 和bang-bang !! 运算符:为什么我不必将它们用于函数的另一个参数?是因为它们在传递给它们的命令中需要作为字符串吗?
    • 嗨@FilippoSanti。问问就好了。 (:1.在管道中创建变量不会将变量添加到原始df(它仅存储在内存中的某种临时df中)。如果要添加到原始df中,则必须分配结果到df,即df &lt;- df %&gt;% .....,然后将变异的df传递给ggplot。 ...
    • ... 2. 你是对的。对于filter(denominazione_regione == reg),我们不需要转换,因为这里reg 作为字符串很好。在dato 的情况下,但是我们希望 R 将字符串解释为变量名或符号(这就是 sym() 正在做的事情)并告诉 ggplot 在我们的数据框中查找这个变量(这就是 !! 正在做的事情)。有关这方面的更多信息,请参见例如tidyeval.tidyverse.org/sec-up-to-speed.html 或查看@MagnusNordmo 提供的链接
    • 感谢@stefan,现在很多关于函数我没有得到的东西都变得有意义了!最佳
    【解决方案2】:

    很高兴您在问题中提供数据。但是,由于我不会说意大利语,因此我很难理解您的变量的含义。但是,我可以在代码中看到一些问题。例如,您需要一个特殊的 {{ }} 符号来创建具有 dplyrggplot2 的函数。请参阅下面的链接。我有一些示例代码,您可以查看或模拟。祝你好运!

    library(tidyverse)
    
    Plot <- function(data,xvar,yvar){ 
      ggplot({{data}},aes({{xvar}},{{yvar}})) + 
        geom_point()
    }
    
    
    Plot(mtcars,mpg,hp)
    
    
    
    Wrangle <- function(data,var1,var2){
      data %>% 
        select({{var1}},{{var2}})
    }
    
    Wrangle(mtcars,hp,mpg)
    
    Combo <- function(data,var1,var2){
      a <- data %>% 
        select({{var1}},{{var2}}) %>% 
        ggplot(aes({{var1}},{{var2}})) + 
        geom_point()
      
      b <- data %>% 
        select({{var1}},{{var2}})
      
      print(a)
      print(b)
    }
    
    Combo(mtcars,hp,mpg)
    

    SO Similar Question

    Cookbook by Hadley Wickham

    【讨论】:

    • 谢谢@Magnus Nordmo,我会调查{{}} 特殊运算符!
    猜你喜欢
    • 2016-11-26
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2020-01-07
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多