From 6cd1b7441f36bb3177d8cd87b0ec6f63b6508df3 Mon Sep 17 00:00:00 2001 From: yohann Date: Wed, 13 Nov 2024 08:39:35 +0100 Subject: [PATCH] add bluesky icon --- _extensions/mcanouil/iconify/LICENSE | 21 + _extensions/mcanouil/iconify/_extension.yml | 7 + .../mcanouil/iconify/iconify-icon.min.js | 13 + _extensions/mcanouil/iconify/iconify.lua | 156 ++++ _quarto.yml | 2 +- _site/bluesky.svg | 3 - about.qmd | 5 +- bluesky.svg | 3 - docs/about.html | 11 +- docs/index-r.xml | 156 +--- docs/index.html | 7 +- docs/index.xml | 158 +--- docs/posts/chartJS/index.html | 3 +- docs/posts/datainpkgs/index.html | 3 +- docs/posts/datainpkgs_video/index.html | 3 +- docs/posts/iaforr/img/01-copilot_rstudio.png | Bin 44976 -> 0 bytes .../iaforr/img/02-copilot_suggestion.png | Bin 23734 -> 0 bytes .../img/03-copilot_suggestion_vscode.png | Bin 22097 -> 0 bytes .../img/04-copilot_suggestion_doc_rstudio.png | Bin 34974 -> 0 bytes docs/posts/iaforr/img/06-copilot_vscode2.png | Bin 12328 -> 0 bytes docs/posts/iaforr/img/07-copilot_chat.png | Bin 10334 -> 0 bytes .../img/08-bis_copilot_chat_result2.png | Bin 32748 -> 0 bytes .../iaforr/img/08-copilot_chat_result.png | Bin 27696 -> 0 bytes docs/posts/iaforr/img/09-copilot_explain.png | Bin 62959 -> 0 bytes .../iaforr/img/10-copilot_explain_result.png | Bin 80078 -> 0 bytes .../iaforr/img/12-copilot_fix_result.png | Bin 41811 -> 0 bytes docs/posts/iaforr/img/13-copilot_review.png | Bin 51680 -> 0 bytes docs/posts/iaforr/img/14-copilot_doc.png | Bin 56115 -> 0 bytes docs/posts/iaforr/img/16-shiny_app.png | Bin 60155 -> 0 bytes docs/posts/iaforr/img/17-shiny_app2.png | Bin 59233 -> 0 bytes docs/posts/iaforr/img/18-othergpt.png | Bin 7047 -> 0 bytes docs/posts/iaforr/img/19-rgpt.png | Bin 80494 -> 0 bytes docs/posts/iaforr/img/20-rwizard.png | Bin 61350 -> 0 bytes docs/posts/iaforr/index.html | 825 +----------------- docs/posts/mycomicslibrary/index.html | 3 +- docs/posts/sweetalert2/index.html | 3 +- docs/posts/vscodeR/index.html | 3 +- docs/posts/welcome/index.html | 3 +- docs/search.json | 42 - .../iconify-2.1.0/iconify-icon.min.js | 13 + docs/sitemap.xml | 8 +- posts/iaforr/index.qmd | 1 + 42 files changed, 245 insertions(+), 1207 deletions(-) create mode 100644 _extensions/mcanouil/iconify/LICENSE create mode 100644 _extensions/mcanouil/iconify/_extension.yml create mode 100644 _extensions/mcanouil/iconify/iconify-icon.min.js create mode 100644 _extensions/mcanouil/iconify/iconify.lua delete mode 100644 _site/bluesky.svg delete mode 100644 bluesky.svg delete mode 100644 docs/posts/iaforr/img/01-copilot_rstudio.png delete mode 100644 docs/posts/iaforr/img/02-copilot_suggestion.png delete mode 100644 docs/posts/iaforr/img/03-copilot_suggestion_vscode.png delete mode 100644 docs/posts/iaforr/img/04-copilot_suggestion_doc_rstudio.png delete mode 100644 docs/posts/iaforr/img/06-copilot_vscode2.png delete mode 100644 docs/posts/iaforr/img/07-copilot_chat.png delete mode 100644 docs/posts/iaforr/img/08-bis_copilot_chat_result2.png delete mode 100644 docs/posts/iaforr/img/08-copilot_chat_result.png delete mode 100644 docs/posts/iaforr/img/09-copilot_explain.png delete mode 100644 docs/posts/iaforr/img/10-copilot_explain_result.png delete mode 100644 docs/posts/iaforr/img/12-copilot_fix_result.png delete mode 100644 docs/posts/iaforr/img/13-copilot_review.png delete mode 100644 docs/posts/iaforr/img/14-copilot_doc.png delete mode 100644 docs/posts/iaforr/img/16-shiny_app.png delete mode 100644 docs/posts/iaforr/img/17-shiny_app2.png delete mode 100644 docs/posts/iaforr/img/18-othergpt.png delete mode 100644 docs/posts/iaforr/img/19-rgpt.png delete mode 100644 docs/posts/iaforr/img/20-rwizard.png create mode 100644 docs/site_libs/quarto-contrib/iconify-2.1.0/iconify-icon.min.js diff --git a/_extensions/mcanouil/iconify/LICENSE b/_extensions/mcanouil/iconify/LICENSE new file mode 100644 index 0000000..4948d9e --- /dev/null +++ b/_extensions/mcanouil/iconify/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mickaël Canouil + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/_extensions/mcanouil/iconify/_extension.yml b/_extensions/mcanouil/iconify/_extension.yml new file mode 100644 index 0000000..47e4246 --- /dev/null +++ b/_extensions/mcanouil/iconify/_extension.yml @@ -0,0 +1,7 @@ +title: Iconify support +author: Mickaël Canouil +version: 2.1.2 +quarto-required: ">=1.2.280" +contributes: + shortcodes: + - iconify.lua diff --git a/_extensions/mcanouil/iconify/iconify-icon.min.js b/_extensions/mcanouil/iconify/iconify-icon.min.js new file mode 100644 index 0000000..5bd8cec --- /dev/null +++ b/_extensions/mcanouil/iconify/iconify-icon.min.js @@ -0,0 +1,13 @@ +/** +* (c) Iconify +* +* For the full copyright and license information, please view the license.txt +* files at https://github.com/iconify/iconify +* +* Licensed under MIT. +* Source: https://github.com/iconify/code/tree/gh-pages/iconify-icon +* +* @license MIT +* @version 2.1.0 +*/ +!function(){"use strict";const t=Object.freeze({left:0,top:0,width:16,height:16}),e=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),n=Object.freeze({...t,...e}),i=Object.freeze({...n,body:"",hidden:!1}),r=Object.freeze({width:null,height:null}),o=Object.freeze({...r,...e});const s=/[\s,]+/;const c={...o,preserveAspectRatio:""};function a(t){const e={...c},n=(e,n)=>t.getAttribute(e)||n;var i;return e.width=n("width",null),e.height=n("height",null),e.rotate=function(t,e=0){const n=t.replace(/^-?[0-9.]*/,"");function i(t){for(;t<0;)t+=4;return t%4}if(""===n){const e=parseInt(t);return isNaN(e)?0:i(e)}if(n!==t){let e=0;switch(n){case"%":e=25;break;case"deg":e=90}if(e){let r=parseFloat(t.slice(0,t.length-n.length));return isNaN(r)?0:(r/=e,r%1==0?i(r):0)}}return e}(n("rotate","")),i=e,n("flip","").split(s).forEach((t=>{switch(t.trim()){case"horizontal":i.hFlip=!0;break;case"vertical":i.vFlip=!0}})),e.preserveAspectRatio=n("preserveAspectRatio",n("preserveaspectratio","")),e}const u=/^[a-z0-9]+(-[a-z0-9]+)*$/,l=(t,e,n,i="")=>{const r=t.split(":");if("@"===t.slice(0,1)){if(r.length<2||r.length>3)return null;i=r.shift().slice(1)}if(r.length>3||!r.length)return null;if(r.length>1){const t=r.pop(),n=r.pop(),o={provider:r.length>0?r[0]:i,prefix:n,name:t};return e&&!f(o)?null:o}const o=r[0],s=o.split("-");if(s.length>1){const t={provider:i,prefix:s.shift(),name:s.join("-")};return e&&!f(t)?null:t}if(n&&""===i){const t={provider:i,prefix:"",name:o};return e&&!f(t,n)?null:t}return null},f=(t,e)=>!!t&&!(""!==t.provider&&!t.provider.match(u)||!(e&&""===t.prefix||t.prefix.match(u))||!t.name.match(u));function d(t,n){const r=function(t,e){const n={};!t.hFlip!=!e.hFlip&&(n.hFlip=!0),!t.vFlip!=!e.vFlip&&(n.vFlip=!0);const i=((t.rotate||0)+(e.rotate||0))%4;return i&&(n.rotate=i),n}(t,n);for(const o in i)o in e?o in t&&!(o in r)&&(r[o]=e[o]):o in n?r[o]=n[o]:o in t&&(r[o]=t[o]);return r}function h(t,e,n){const i=t.icons,r=t.aliases||Object.create(null);let o={};function s(t){o=d(i[t]||r[t],o)}return s(e),n.forEach(s),d(t,o)}function p(t,e){const n=[];if("object"!=typeof t||"object"!=typeof t.icons)return n;t.not_found instanceof Array&&t.not_found.forEach((t=>{e(t,null),n.push(t)}));const i=function(t,e){const n=t.icons,i=t.aliases||Object.create(null),r=Object.create(null);return(e||Object.keys(n).concat(Object.keys(i))).forEach((function t(e){if(n[e])return r[e]=[];if(!(e in r)){r[e]=null;const n=i[e]&&i[e].parent,o=n&&t(n);o&&(r[e]=[n].concat(o))}return r[e]})),r}(t);for(const r in i){const o=i[r];o&&(e(r,h(t,r,o)),n.push(r))}return n}const g={provider:"",aliases:{},not_found:{},...t};function b(t,e){for(const n in e)if(n in t&&typeof t[n]!=typeof e[n])return!1;return!0}function v(t){if("object"!=typeof t||null===t)return null;const e=t;if("string"!=typeof e.prefix||!t.icons||"object"!=typeof t.icons)return null;if(!b(t,g))return null;const n=e.icons;for(const t in n){const e=n[t];if(!t.match(u)||"string"!=typeof e.body||!b(e,i))return null}const r=e.aliases||Object.create(null);for(const t in r){const e=r[t],o=e.parent;if(!t.match(u)||"string"!=typeof o||!n[o]&&!r[o]||!b(e,i))return null}return e}const m=Object.create(null);function y(t,e){const n=m[t]||(m[t]=Object.create(null));return n[e]||(n[e]=function(t,e){return{provider:t,prefix:e,icons:Object.create(null),missing:new Set}}(t,e))}function x(t,e){return v(e)?p(e,((e,n)=>{n?t.icons[e]=n:t.missing.add(e)})):[]}function w(t,e){let n=[];return("string"==typeof t?[t]:Object.keys(m)).forEach((t=>{("string"==typeof t&&"string"==typeof e?[e]:Object.keys(m[t]||{})).forEach((e=>{const i=y(t,e);n=n.concat(Object.keys(i.icons).map((n=>(""!==t?"@"+t+":":"")+e+":"+n)))}))})),n}let _=!1;function k(t){return"boolean"==typeof t&&(_=t),_}function j(t){const e="string"==typeof t?l(t,!0,_):t;if(e){const t=y(e.provider,e.prefix),n=e.name;return t.icons[n]||(t.missing.has(n)?null:void 0)}}function A(t,e){const n=l(t,!0,_);if(!n)return!1;return function(t,e,n){try{if("string"==typeof n.body)return t.icons[e]={...n},!0}catch(t){}return!1}(y(n.provider,n.prefix),n.name,e)}function O(t,e){if("object"!=typeof t)return!1;if("string"!=typeof e&&(e=t.provider||""),_&&!e&&!t.prefix){let e=!1;return v(t)&&(t.prefix="",p(t,((t,n)=>{n&&A(t,n)&&(e=!0)}))),e}const n=t.prefix;if(!f({provider:e,prefix:n,name:"a"}))return!1;return!!x(y(e,n),t)}function C(t){return!!j(t)}function I(t){const e=j(t);return e?{...n,...e}:null}function S(t,e){t.forEach((t=>{const n=t.loaderCallbacks;n&&(t.loaderCallbacks=n.filter((t=>t.id!==e)))}))}let E=0;const M=Object.create(null);function T(t,e){M[t]=e}function F(t){return M[t]||M[""]}var R={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function L(t,e,n,i){const r=t.resources.length,o=t.random?Math.floor(Math.random()*r):t.index;let s;if(t.random){let e=t.resources.slice(0);for(s=[];e.length>1;){const t=Math.floor(Math.random()*e.length);s.push(e[t]),e=e.slice(0,t).concat(e.slice(t+1))}s=s.concat(e)}else s=t.resources.slice(o).concat(t.resources.slice(0,o));const c=Date.now();let a,u="pending",l=0,f=null,d=[],h=[];function p(){f&&(clearTimeout(f),f=null)}function g(){"pending"===u&&(u="aborted"),p(),d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function b(t,e){e&&(h=[]),"function"==typeof t&&h.push(t)}function v(){u="failed",h.forEach((t=>{t(void 0,a)}))}function m(){d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function y(){if("pending"!==u)return;p();const i=s.shift();if(void 0===i)return d.length?void(f=setTimeout((()=>{p(),"pending"===u&&(m(),v())}),t.timeout)):void v();const r={status:"pending",resource:i,callback:(e,n)=>{!function(e,n,i){const r="success"!==n;switch(d=d.filter((t=>t!==e)),u){case"pending":break;case"failed":if(r||!t.dataAfterTimeout)return;break;default:return}if("abort"===n)return a=i,void v();if(r)return a=i,void(d.length||(s.length?y():v()));if(p(),m(),!t.random){const n=t.resources.indexOf(e.resource);-1!==n&&n!==t.index&&(t.index=n)}u="completed",h.forEach((t=>{t(i)}))}(r,e,n)}};d.push(r),l++,f=setTimeout(y,t.rotate),n(i,e,r.callback)}return"function"==typeof i&&h.push(i),setTimeout(y),function(){return{startTime:c,payload:e,status:u,queriesSent:l,queriesPending:d.length,subscribe:b,abort:g}}}function P(t){const e={...R,...t};let n=[];function i(){n=n.filter((t=>"pending"===t().status))}return{query:function(t,r,o){const s=L(e,t,r,((t,e)=>{i(),o&&o(t,e)}));return n.push(s),s},find:function(t){return n.find((e=>t(e)))||null},setIndex:t=>{e.index=t},getIndex:()=>e.index,cleanup:i}}function N(t){let e;if("string"==typeof t.resources)e=[t.resources];else if(e=t.resources,!(e instanceof Array&&e.length))return null;return{resources:e,path:t.path||"/",maxURL:t.maxURL||500,rotate:t.rotate||750,timeout:t.timeout||5e3,random:!0===t.random,index:t.index||0,dataAfterTimeout:!1!==t.dataAfterTimeout}}const z=Object.create(null),Q=["https://api.simplesvg.com","https://api.unisvg.com"],q=[];for(;Q.length>0;)1===Q.length||Math.random()>.5?q.push(Q.shift()):q.push(Q.pop());function D(t,e){const n=N(e);return null!==n&&(z[t]=n,!0)}function U(t){return z[t]}function H(){return Object.keys(z)}function J(){}z[""]=N({resources:["https://api.iconify.design"].concat(q)});const $=Object.create(null);function B(t,e,n){let i,r;if("string"==typeof t){const e=F(t);if(!e)return n(void 0,424),J;r=e.send;const o=function(t){if(!$[t]){const e=U(t);if(!e)return;const n={config:e,redundancy:P(e)};$[t]=n}return $[t]}(t);o&&(i=o.redundancy)}else{const e=N(t);if(e){i=P(e);const n=F(t.resources?t.resources[0]:"");n&&(r=n.send)}}return i&&r?i.query(e,r,n)().abort:(n(void 0,424),J)}const G="iconify2",V="iconify",K=V+"-count",W=V+"-version",X=36e5,Y=168,Z=50;function tt(t,e){try{return t.getItem(e)}catch(t){}}function et(t,e,n){try{return t.setItem(e,n),!0}catch(t){}}function nt(t,e){try{t.removeItem(e)}catch(t){}}function it(t,e){return et(t,K,e.toString())}function rt(t){return parseInt(tt(t,K))||0}const ot={local:!0,session:!0},st={local:new Set,session:new Set};let ct=!1;let at="undefined"==typeof window?{}:window;function ut(t){const e=t+"Storage";try{if(at&&at[e]&&"number"==typeof at[e].length)return at[e]}catch(t){}ot[t]=!1}function lt(t,e){const n=ut(t);if(!n)return;const i=tt(n,W);if(i!==G){if(i){const t=rt(n);for(let e=0;e{const i=V+t.toString(),o=tt(n,i);if("string"==typeof o){try{const n=JSON.parse(o);if("object"==typeof n&&"number"==typeof n.cached&&n.cached>r&&"string"==typeof n.provider&&"object"==typeof n.data&&"string"==typeof n.data.prefix&&e(n,t))return!0}catch(t){}nt(n,i)}};let s=rt(n);for(let e=s-1;e>=0;e--)o(e)||(e===s-1?(s--,it(n,s)):st[t].add(e))}function ft(){if(!ct){ct=!0;for(const t in ot)lt(t,(t=>{const e=t.data,n=y(t.provider,e.prefix);if(!x(n,e).length)return!1;const i=e.lastModified||-1;return n.lastModifiedCached=n.lastModifiedCached?Math.min(n.lastModifiedCached,i):i,!0}))}}function dt(t,e){function n(n){let i;if(!ot[n]||!(i=ut(n)))return;const r=st[n];let o;if(r.size)r.delete(o=Array.from(r).shift());else if(o=rt(i),o>=Z||!it(i,o+1))return;const s={cached:Math.floor(Date.now()/X),provider:t.provider,data:e};return et(i,V+o.toString(),JSON.stringify(s))}ct||ft(),e.lastModified&&!function(t,e){const n=t.lastModifiedCached;if(n&&n>=e)return n===e;if(t.lastModifiedCached=e,n)for(const n in ot)lt(n,(n=>{const i=n.data;return n.provider!==t.provider||i.prefix!==t.prefix||i.lastModified===e}));return!0}(t,e.lastModified)||Object.keys(e.icons).length&&(e.not_found&&delete(e=Object.assign({},e)).not_found,n("local")||n("session"))}function ht(){}function pt(t){t.iconsLoaderFlag||(t.iconsLoaderFlag=!0,setTimeout((()=>{t.iconsLoaderFlag=!1,function(t){t.pendingCallbacksFlag||(t.pendingCallbacksFlag=!0,setTimeout((()=>{t.pendingCallbacksFlag=!1;const e=t.loaderCallbacks?t.loaderCallbacks.slice(0):[];if(!e.length)return;let n=!1;const i=t.provider,r=t.prefix;e.forEach((e=>{const o=e.icons,s=o.pending.length;o.pending=o.pending.filter((e=>{if(e.prefix!==r)return!0;const s=e.name;if(t.icons[s])o.loaded.push({provider:i,prefix:r,name:s});else{if(!t.missing.has(s))return n=!0,!0;o.missing.push({provider:i,prefix:r,name:s})}return!1})),o.pending.length!==s&&(n||S([t],e.id),e.callback(o.loaded.slice(0),o.missing.slice(0),o.pending.slice(0),e.abort))}))})))}(t)})))}const gt=(t,e)=>{const n=function(t,e=!0,n=!1){const i=[];return t.forEach((t=>{const r="string"==typeof t?l(t,e,n):t;r&&i.push(r)})),i}(t,!0,k()),i=function(t){const e={loaded:[],missing:[],pending:[]},n=Object.create(null);t.sort(((t,e)=>t.provider!==e.provider?t.provider.localeCompare(e.provider):t.prefix!==e.prefix?t.prefix.localeCompare(e.prefix):t.name.localeCompare(e.name)));let i={provider:"",prefix:"",name:""};return t.forEach((t=>{if(i.name===t.name&&i.prefix===t.prefix&&i.provider===t.provider)return;i=t;const r=t.provider,o=t.prefix,s=t.name,c=n[r]||(n[r]=Object.create(null)),a=c[o]||(c[o]=y(r,o));let u;u=s in a.icons?e.loaded:""===o||a.missing.has(s)?e.missing:e.pending;const l={provider:r,prefix:o,name:s};u.push(l)})),e}(n);if(!i.pending.length){let t=!0;return e&&setTimeout((()=>{t&&e(i.loaded,i.missing,i.pending,ht)})),()=>{t=!1}}const r=Object.create(null),o=[];let s,c;return i.pending.forEach((t=>{const{provider:e,prefix:n}=t;if(n===c&&e===s)return;s=e,c=n,o.push(y(e,n));const i=r[e]||(r[e]=Object.create(null));i[n]||(i[n]=[])})),i.pending.forEach((t=>{const{provider:e,prefix:n,name:i}=t,o=y(e,n),s=o.pendingIcons||(o.pendingIcons=new Set);s.has(i)||(s.add(i),r[e][n].push(i))})),o.forEach((t=>{const{provider:e,prefix:n}=t;r[e][n].length&&function(t,e){t.iconsToLoad?t.iconsToLoad=t.iconsToLoad.concat(e).sort():t.iconsToLoad=e,t.iconsQueueFlag||(t.iconsQueueFlag=!0,setTimeout((()=>{t.iconsQueueFlag=!1;const{provider:e,prefix:n}=t,i=t.iconsToLoad;let r;delete t.iconsToLoad,i&&(r=F(e))&&r.prepare(e,n,i).forEach((n=>{B(e,n,(e=>{if("object"!=typeof e)n.icons.forEach((e=>{t.missing.add(e)}));else try{const n=x(t,e);if(!n.length)return;const i=t.pendingIcons;i&&n.forEach((t=>{i.delete(t)})),dt(t,e)}catch(t){console.error(t)}pt(t)}))}))})))}(t,r[e][n])})),e?function(t,e,n){const i=E++,r=S.bind(null,n,i);if(!e.pending.length)return r;const o={id:i,icons:e,callback:t,abort:r};return n.forEach((t=>{(t.loaderCallbacks||(t.loaderCallbacks=[])).push(o)})),r}(e,i,o):ht},bt=t=>new Promise(((e,i)=>{const r="string"==typeof t?l(t,!0):t;r?gt([r||t],(o=>{if(o.length&&r){const t=j(r);if(t)return void e({...n,...t})}i(t)})):i(t)}));function vt(t,e){const n="string"==typeof t?l(t,!0,!0):null;if(!n){const e=function(t){try{const e="string"==typeof t?JSON.parse(t):t;if("string"==typeof e.body)return{...e}}catch(t){}}(t);return{value:t,data:e}}const i=j(n);if(void 0!==i||!n.prefix)return{value:t,name:n,data:i};const r=gt([n],(()=>e(t,n,j(n))));return{value:t,name:n,loading:r}}let mt=!1;try{mt=0===navigator.vendor.indexOf("Apple")}catch(t){}const yt=/(-?[0-9.]*[0-9]+[0-9.]*)/g,xt=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function wt(t,e,n){if(1===e)return t;if(n=n||100,"number"==typeof t)return Math.ceil(t*e*n)/n;if("string"!=typeof t)return t;const i=t.split(yt);if(null===i||!i.length)return t;const r=[];let o=i.shift(),s=xt.test(o);for(;;){if(s){const t=parseFloat(o);isNaN(t)?r.push(o):r.push(Math.ceil(t*e*n)/n)}else r.push(o);if(o=i.shift(),void 0===o)return r.join("");s=!s}}const _t=t=>"unset"===t||"undefined"===t||"none"===t;function kt(t,e){const i={...n,...t},r={...o,...e},s={left:i.left,top:i.top,width:i.width,height:i.height};let c=i.body;[i,r].forEach((t=>{const e=[],n=t.hFlip,i=t.vFlip;let r,o=t.rotate;switch(n?i?o+=2:(e.push("translate("+(s.width+s.left).toString()+" "+(0-s.top).toString()+")"),e.push("scale(-1 1)"),s.top=s.left=0):i&&(e.push("translate("+(0-s.left).toString()+" "+(s.height+s.top).toString()+")"),e.push("scale(1 -1)"),s.top=s.left=0),o<0&&(o-=4*Math.floor(o/4)),o%=4,o){case 1:r=s.height/2+s.top,e.unshift("rotate(90 "+r.toString()+" "+r.toString()+")");break;case 2:e.unshift("rotate(180 "+(s.width/2+s.left).toString()+" "+(s.height/2+s.top).toString()+")");break;case 3:r=s.width/2+s.left,e.unshift("rotate(-90 "+r.toString()+" "+r.toString()+")")}o%2==1&&(s.left!==s.top&&(r=s.left,s.left=s.top,s.top=r),s.width!==s.height&&(r=s.width,s.width=s.height,s.height=r)),e.length&&(c=function(t,e,n){const i=function(t,e="defs"){let n="";const i=t.indexOf("<"+e);for(;i>=0;){const r=t.indexOf(">",i),o=t.indexOf("",o);if(-1===s)break;n+=t.slice(r+1,o).trim(),t=t.slice(0,i).trim()+t.slice(s+1)}return{defs:n,content:t}}(t);return r=i.defs,o=e+i.content+n,r?""+r+""+o:o;var r,o}(c,'',""))}));const a=r.width,u=r.height,l=s.width,f=s.height;let d,h;null===a?(h=null===u?"1em":"auto"===u?f:u,d=wt(h,l/f)):(d="auto"===a?l:a,h=null===u?wt(d,f/l):"auto"===u?f:u);const p={},g=(t,e)=>{_t(e)||(p[t]=e.toString())};g("width",d),g("height",h);const b=[s.left,s.top,l,f];return p.viewBox=b.join(" "),{attributes:p,viewBox:b,body:c}}function jt(t,e){let n=-1===t.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const t in e)n+=" "+t+'="'+e[t]+'"';return'"+t+""}function At(t){return'url("'+function(t){return"data:image/svg+xml,"+function(t){return t.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}(t)}(t)+'")'}let Ot=(()=>{let t;try{if(t=fetch,"function"==typeof t)return t}catch(t){}})();function Ct(t){Ot=t}function It(){return Ot}const St={prepare:(t,e,n)=>{const i=[],r=function(t,e){const n=U(t);if(!n)return 0;let i;if(n.maxURL){let t=0;n.resources.forEach((e=>{const n=e;t=Math.max(t,n.length)}));const r=e+".json?icons=";i=n.maxURL-t-n.path.length-r.length}else i=0;return i}(t,e),o="icons";let s={type:o,provider:t,prefix:e,icons:[]},c=0;return n.forEach(((n,a)=>{c+=n.length+1,c>=r&&a>0&&(i.push(s),s={type:o,provider:t,prefix:e,icons:[]},c=n.length),s.icons.push(n)})),i.push(s),i},send:(t,e,n)=>{if(!Ot)return void n("abort",424);let i=function(t){if("string"==typeof t){const e=U(t);if(e)return e.path}return"/"}(e.provider);switch(e.type){case"icons":{const t=e.prefix,n=e.icons.join(",");i+=t+".json?"+new URLSearchParams({icons:n}).toString();break}case"custom":{const t=e.uri;i+="/"===t.slice(0,1)?t.slice(1):t;break}default:return void n("abort",400)}let r=503;Ot(t+i).then((t=>{const e=t.status;if(200===e)return r=501,t.json();setTimeout((()=>{n(function(t){return 404===t}(e)?"abort":"next",e)}))})).then((t=>{"object"==typeof t&&null!==t?setTimeout((()=>{n("success",t)})):setTimeout((()=>{404===t?n("abort",t):n("next",r)}))})).catch((()=>{n("next",r)}))}};function Et(t,e){switch(t){case"local":case"session":ot[t]=e;break;case"all":for(const t in ot)ot[t]=e}}const Mt="data-style";let Tt="";function Ft(t){Tt=t}function Rt(t,e){let n=Array.from(t.childNodes).find((t=>t.hasAttribute&&t.hasAttribute(Mt)));n||(n=document.createElement("style"),n.setAttribute(Mt,Mt),t.appendChild(n)),n.textContent=":host{display:inline-block;vertical-align:"+(e?"-0.125em":"0")+"}span,svg{display:block}"+Tt}const Lt={"background-color":"currentColor"},Pt={"background-color":"transparent"},Nt={image:"var(--svg)",repeat:"no-repeat",size:"100% 100%"},zt={"-webkit-mask":Lt,mask:Lt,background:Pt};for(const t in zt){const e=zt[t];for(const n in Nt)e[t+"-"+n]=Nt[n]}function Qt(t){return t?t+(t.match(/^[-0-9.]+$/)?"px":""):"inherit"}let qt;function Dt(t){return void 0===qt&&function(){try{qt=window.trustedTypes.createPolicy("iconify",{createHTML:t=>t})}catch(t){qt=null}}(),qt?qt.createHTML(t):t}function Ut(t){return Array.from(t.childNodes).find((t=>{const e=t.tagName&&t.tagName.toUpperCase();return"SPAN"===e||"SVG"===e}))}function Ht(t,e){const i=e.icon.data,r=e.customisations,o=kt(i,r);r.preserveAspectRatio&&(o.attributes.preserveAspectRatio=r.preserveAspectRatio);const s=e.renderedMode;let c;if("svg"===s)c=function(t){const e=document.createElement("span"),n=t.attributes;let i="";n.width||(i="width: inherit;"),n.height||(i+="height: inherit;"),i&&(n.style=i);const r=jt(t.body,n);return e.innerHTML=Dt(r),e.firstChild}(o);else c=function(t,e,n){const i=document.createElement("span");let r=t.body;-1!==r.indexOf("{this._check()})))}_check(){if(!this._checkQueued)return;this._checkQueued=!1;const t=this._state,e=this.getAttribute("icon");if(e!==t.icon.value)return void this._iconChanged(e);if(!t.rendered||!this._visible)return;const n=this.getAttribute("mode"),i=a(this);t.attrMode===n&&!function(t,e){for(const n in c)if(t[n]!==e[n])return!0;return!1}(t.customisations,i)&&Ut(this._shadowRoot)||this._renderIcon(t.icon,i,n)}_iconChanged(t){const e=vt(t,((t,e,n)=>{const i=this._state;if(i.rendered||this.getAttribute("icon")!==t)return;const r={value:t,name:e,data:n};r.data?this._gotIconData(r):i.icon=r}));e.data?this._gotIconData(e):this._state=Jt(e,this._state.inline,this._state)}_forceRender(){if(this._visible)this._queueCheck();else{const t=Ut(this._shadowRoot);t&&this._shadowRoot.removeChild(t)}}_gotIconData(t){this._checkQueued=!1,this._renderIcon(t,a(this),this.getAttribute("mode"))}_renderIcon(t,e,n){const i=function(t,e){switch(e){case"svg":case"bg":case"mask":return e}return"style"===e||!mt&&-1!==t.indexOf("{const e=t.some((t=>t.isIntersecting));e!==this._visible&&(this._visible=e,this._forceRender())})),this._observer.observe(this)}catch(t){if(this._observer){try{this._observer.disconnect()}catch(t){}this._observer=null}}}stopObserver(){this._observer&&(this._observer.disconnect(),this._observer=null,this._visible=!0,this._connected&&this._forceRender())}};r.forEach((t=>{t in o.prototype||Object.defineProperty(o.prototype,t,{get:function(){return this.getAttribute(t)},set:function(e){null!==e?this.setAttribute(t,e):this.removeAttribute(t)}})}));const s=function(){let t;T("",St),k(!0);try{t=window}catch(t){}if(t){if(ft(),void 0!==t.IconifyPreload){const e=t.IconifyPreload,n="Invalid IconifyPreload syntax.";"object"==typeof e&&null!==e&&(e instanceof Array?e:[e]).forEach((t=>{try{("object"!=typeof t||null===t||t instanceof Array||"object"!=typeof t.icons||"string"!=typeof t.prefix||!O(t))&&console.error(n)}catch(t){console.error(n)}}))}if(void 0!==t.IconifyProviders){const e=t.IconifyProviders;if("object"==typeof e&&null!==e)for(const t in e){const n="IconifyProviders["+t+"] is invalid.";try{const i=e[t];if("object"!=typeof i||!i||void 0===i.resources)continue;D(t,i)||console.error(n)}catch(t){console.error(n)}}}}return{enableCache:t=>Et(t,!0),disableCache:t=>Et(t,!1),iconLoaded:C,iconExists:C,getIcon:I,listIcons:w,addIcon:A,addCollection:O,calculateSize:wt,buildIcon:kt,iconToHTML:jt,svgToURL:At,loadIcons:gt,loadIcon:bt,addAPIProvider:D,appendCustomStyle:Ft,_api:{getAPIConfig:U,setAPIModule:T,sendAPIQuery:B,setFetch:Ct,getFetch:It,listAPIProviders:H}}}();for(const t in s)o[t]=o.prototype[t]=s[t];e.define(t,o)}()}(); diff --git a/_extensions/mcanouil/iconify/iconify.lua b/_extensions/mcanouil/iconify/iconify.lua new file mode 100644 index 0000000..d5c89a4 --- /dev/null +++ b/_extensions/mcanouil/iconify/iconify.lua @@ -0,0 +1,156 @@ +--[[ +# MIT License +# +# Copyright (c) Mickaël Canouil +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +]] + +local function ensure_html_deps() + quarto.doc.add_html_dependency({ + name = 'iconify', + version = '2.1.0', + scripts = {"iconify-icon.min.js"} + }) +end + +local function is_empty(s) + return s == nil or s == '' +end + +local function is_valid_size(size) + if is_empty(size) then + return '' + end + local size_table = { + ["tiny"] = "0.5em", + ["scriptsize"] = "0.7em", + ["footnotesize"] = "0.8em", + ["small"] = "0.9em", + ["normalsize"] = "1em", + ["large"] = "1.2em", + ["Large"] = "1.5em", + ["LARGE"] = "1.75em", + ["huge"] = "2em", + ["Huge"] = "2.5em", + ["1x"] = "1em", + ["2x"] = "2em", + ["3x"] = "3em", + ["4x"] = "4em", + ["5x"] = "5em", + ["6x"] = "6em", + ["7x"] = "7em", + ["8x"] = "8em", + ["9x"] = "9em", + ["10x"] = "10em", + ["2xs"] = "0.625em", + ["xs"] = "0.75em", + ["sm"] = "0.875em", + ["lg"] = "1.25em", + ["xl"] = "1.5em", + ["2xl"] = "2em" + } + for key, value in pairs(size_table) do + if key == size then + return 'font-size: ' .. value .. ';' + end + end + return 'font-size: ' .. size .. ';' +end + +return { + ["iconify"] = function(args, kwargs) + -- detect html (excluding epub which won't handle fa) + if quarto.doc.is_format("html:js") then + ensure_html_deps() + local icon = pandoc.utils.stringify(args[1]) + local set = "fluent-emoji" + + if #args > 1 and string.find(pandoc.utils.stringify(args[2]), ":") then + quarto.log.warning( + 'Use "set:icon" or "set icon" syntax, not both! ' .. + 'Using "set:icon" syntax and discarding first argument!' + ) + icon = pandoc.utils.stringify(args[2]) + end + + if string.find(icon, ":") then + set = string.sub(icon, 1, string.find(icon, ":") - 1) + icon = string.sub(icon, string.find(icon, ":") + 1) + elseif #args > 1 then + set = icon + icon = pandoc.utils.stringify(args[2]) + end + + local attributes = ' icon="' .. set .. ':' .. icon .. '"' + local default_label = 'Icon ' .. icon .. ' from ' .. set .. ' Iconify.design set.' + + local size = is_valid_size(pandoc.utils.stringify(kwargs["size"])) + if not is_empty(size) then + attributes = attributes .. ' style="' .. size .. '"' + end + + local aria_label = pandoc.utils.stringify(kwargs["label"]) + if is_empty(aria_label) then + aria_label = ' aria-label="' .. default_label .. '"' + else + aria_label = ' aria-label="' .. aria_label .. '"' + end + + local title = pandoc.utils.stringify(kwargs["title"]) + if is_empty(title) then + title = ' title="' .. default_label .. '"' + else + title = ' title="' .. title .. '"' + end + + attributes = attributes .. aria_label .. title + + local width = pandoc.utils.stringify(kwargs["width"]) + if not is_empty(width) and is_empty(size) then + attributes = attributes .. ' width="' .. width .. '"' + end + local height = pandoc.utils.stringify(kwargs["height"]) + if not is_empty(height) and is_empty(size) then + attributes = attributes .. ' height="' .. height .. '"' + end + local flip = pandoc.utils.stringify(kwargs["flip"]) + if not is_empty(flip) then + attributes = attributes .. ' flip="' .. flip.. '"' + end + local rotate = pandoc.utils.stringify(kwargs["rotate"]) + if not is_empty(rotate) then + attributes = attributes .. ' rotate="' .. rotate .. '"' + end + + local inline = pandoc.utils.stringify(kwargs["inline"]) + if is_empty(inline) or inline ~= "false" then + attributes = ' inline ' .. attributes + end + + + return pandoc.RawInline( + 'html', + '' + ) + else + return pandoc.Null() + end + end +} diff --git a/_quarto.yml b/_quarto.yml index f7486ae..6a04173 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -23,7 +23,7 @@ website: href: https://github.com/ - icon: linkedin href: https://www.linkedin.com/in/yohann-mansiaux-1816aa20/ - - text: Bluesky + - text: "{{< iconify logos:bluesky >}}" href: https://bsky.app/profile/yosky.bsky.social - icon: envelope url: "mailto:yohann.mansiaux@gmail.com" diff --git a/_site/bluesky.svg b/_site/bluesky.svg deleted file mode 100644 index f2a1ed5..0000000 --- a/_site/bluesky.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/about.qmd b/about.qmd index da4c67c..52b4a15 100644 --- a/about.qmd +++ b/about.qmd @@ -4,16 +4,13 @@ image: moi.jpg about: template: jolla links: - - text: Bluesky + - text: "{{< iconify logos:bluesky >}}" href: https://bsky.app/profile/yosky.bsky.social - icon: linkedin - text: LinkedIn href: https://www.linkedin.com/in/yohann-mansiaux-1816aa20/ - icon: github - text: Github href: https://github.com/ymansiaux - icon: envelope - text: yohann.mansiaux@gmail.com url: "mailto:yohann.mansiaux@gmail.com" --- diff --git a/bluesky.svg b/bluesky.svg deleted file mode 100644 index f2a1ed5..0000000 --- a/bluesky.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/about.html b/docs/about.html index db28be1..5651a8b 100644 --- a/docs/about.html +++ b/docs/about.html @@ -40,6 +40,7 @@ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
-
-
-

How Github Copilot and ChatGPT have changed my life as an R developer

-
-
development
-
package
-
ia
-
R
-
-
-
- - -
- -
-
Author
-
-

Yohann Mansiaux

-
-
- -
-
Published
-
-

November 9, 2024

-
-
- - -
- - -
- - - - -
- - - - - -

The world of development is evolving rapidly, and artificial intelligence (AI) is playing an increasingly crucial role in developers’ daily lives. With the rise of AI tools, R developers can now automate repetitive tasks, speed up their workflow, and even discover new methods for analysis and visualization.

-

I’ll focus on a specific AI tool that can significantly assist R developers: GitHub Copilot. Copilot offers a variety of features, from code generation to programming assistance, automatic documentation, and problem-solving.

-

I’ll also give a quick feedback about my usage of ChatGPT.

-
-

GitHub Copilot

-

GitHub Copilot is an AI tool that assists developers in their daily work by generating code and other code-related elements (such as documentation) based on context. Copilot can be used as an extension for VSCode. Since the release of version 2023.09.0, GitHub Copilot is also available in RStudio. Copilot can be used to generate R code, comments, unit tests, documentation, and more.

-
-

What Are the Prerequisites for Using GitHub Copilot?

-

To use GitHub Copilot, you need a GitHub account and a Copilot license. This tool is paid (see pricing options), but students, teachers, and maintainers of popular open-source projects can get a free license.

-
-
-

GitHub Copilot in RStudio

-

To use GitHub Copilot in RStudio, install the latest version of RStudio (2023.09.0 or later). Once installed, activate Copilot by going to Tools > Global Options > Copilot and checking the box Enable GitHub Copilot.

-

-

If you want Copilot to base its suggestions not only on the current file but also on other project files, check the box Index project files with GitHub Copilot.

-
-
-

GitHub Copilot in VSCode

-

To use GitHub Copilot in VSCode, install the GitHub Copilot extension. Once the extension is installed, enable Copilot by logging into your GitHub account.

-
-
-

GitHub Copilot in Positron

-

Currently, GitHub Copilot is not available in Positron.

-
-
-
-

GitHub Copilot for R Development

-

We’ll review GitHub Copilot’s features for R development. Some features are available in both RStudio and VSCode, while others can only be used in VSCode.

-
-

Code Completion: Writing Functions

-

Let’s say we’re developing an R package and want to write a function to clean text by removing spaces and special characters.

-

We start with a comment describing the function’s intent and provide an empty function skeleton:

-
# Function to clean text by removing spaces and special characters
-clean_text <- function(text) {  
-}
-

After a few seconds, Copilot suggests an implementation for clean_text. Suggestions appear in gray and can be accepted by pressing the Tab key.

-

-

The initial function comment isn’t mandatory, but it helps Copilot better understand the context and suggest more relevant code.

-

Code completion also works seamlessly in VSCode.

-

-

Interestingly, in both cases, a step to convert text to lowercase is suggested, even though I didn’t request it. This could be useful, but make sure this step fits your use case. Remember, Copilot isn’t perfect and may sometimes generate incorrect or inappropriate code. Always review and modify the generated code as necessary.

-

You can continue in RStudio to generate the function’s documentation with Roxygen tags, for instance. Again, starting with a comment indicating your intention allows Copilot to suggest documentation.

-

-

RStudio usage is limited to code completion, so we’ll switch to VSCode to showcase more advanced features and a fuller development experience.

-
-
-

How to Access GitHub Copilot Features in VSCode?

-

There are multiple ways to access Copilot’s interface in VSCode. Right-clicking on an open file allows you to access the Copilot option in the context menu. You can also use the shortcut Ctrl + Shift + P (on Windows) to open the command palette, then type Copilot to access the interface. Recently, a Copilot icon was also added to the VSCode toolbar.

-

-
-
-

Chat

-

Copilot can be used as a chatbot to get information on functions or packages, or to write code, as we did before.

-

-

-

Again, providing as much context as possible will lead to more relevant suggestions.

-

You can also use the chat to modify the code Copilot initially generated, for example, to change the packages used.

-

-
-
-

Code Explanation

-

Copilot can also explain code. For example, if you don’t understand some code, you can ask Copilot to explain it.

-

-

Note: This feature is also accessible via chat by typing “/explain”.

-
-
-

Code Correction

-

Following the same process, select the “Fix” option to detect errors in the code. Here, Copilot didn’t detect an error but suggested an enhancement. Our code didn’t initially trim leading and trailing spaces. Copilot offers a solution to fix this.

-

-

Note: This feature is also accessible via chat by typing “/fix”.

-
-
-

Code Review

-

The “Review and Comment” feature suggests improvements for style or performance.

-

-
-
-

Documentation

-

The “Generate Doc” feature creates a Roxygen documentation skeleton for the function. The generated documentation is often generic, so you’ll usually need to complete it, particularly for parameter explanations or reproducible examples. For instance, it may omit an @export tag, which could cause issues during a devtools::check() of your package!

-

-

Note: This feature is also accessible via chat by typing “/doc”.

-
-
-

Unit Tests

-

The “Generate Tests” option generates unit tests for the function. It works well but has the drawback of adding the test file in the package’s R/ folder. You’ll need to move the content into a chosen file in the testthat/tests/ folder.

-

Note: This feature is also accessible via chat by typing “/tests”.

-
-
-

What About {shiny}?

-

Though we’ve focused on R package development, Copilot can also be used to develop Shiny applications. For example, to generate a simple Shiny app, start with a comment describing the app, and let Copilot generate the code. This is very useful for quickly setting up a UI, but as always, you’ll need to refine the code to meet specific needs.

-

-

For a Shiny development assistant, you can also check out ShinyAssistant.

-
-
-

Summary of the R Developer Experience with GitHub Copilot

-

GitHub Copilot is a powerful tool that can greatly accelerate R package development. It can generate code, documentation, unit tests, and more. However, remember that Copilot isn’t perfect and can sometimes produce incorrect or unsuitable code. It’s essential to review and adjust the generated code as needed. It’s equally important to revise generated documentation and tests for accuracy and relevance.

-

To ensure sufficient unit tests, it’s recommended to check package coverage using the {covr} package.

-

Moreover, there’s no magic behind this tool—GitHub Copilot bases its suggestions on the current file’s content and other project files. The more precise the context, the more relevant the suggestions will be. Taking extra care with function and parameter names makes suggestions as suitable as possible (this is true for development even without Copilot!).

-
-
-
-

How can I use ChatGPT as an R developer?

-

I also often rely on ChatGPT for R-programming related tasks.

-

More often, I’ll use ChatGPT in advance of a task, to compare its suggestions with the way I would have approached the problem. This allows me to see if I’ve forgotten something, or if I couldn’t have done things differently.

-

I’ll also use his knowledge to give me information on a package I don’t know, or to give me examples of code. It’s a great complement to the official documentation.

-

In the same way, I’ll ask him to explain errors I encounter, or concepts I don’t understand.

-

Finally, as with Github Copilot, the key lies in the quality of the question asked. The more precise the question, the more relevant the answer.

-

I often tend to start my queries with: “I’m an R developer and I prefer using tidyverse packages. I’d like to know what I can do to…”. Telling him if you’re a user of specific packages can help refine the suggestions.

-

Explain how a conversational assistant can answer specific questions, help with debugging, generate code examples and provide detailed explanations of errors or package usage.

-
-

Did you know that some R-specific GPT’s are available?

-

I recently discovered that some R-specific GPT’s are available. They are trained on R-specific data and can provide more relevant answers to R-related questions. I haven’t had the opportunity to test them yet, but I’m looking forward to it.

-

Here is the way to access them:

-

You should click on “Explore GPTs” in the ChatGPT interface, then type “R programming” in the search menu.

-

-

-

-

Among the many R-specific GPT’s available, I recommend using R Wizard, which seems to be the most popular among R developers.

-
-
-
-

Conclusion

-

For R programmers, GitHub Copilot and ChatGPT can complement each other effectively. Copilot shines for in-context code generation, while ChatGPT is ideal for answering questions, exploring R libraries, and understanding errors. By combining these tools, R developers can boost productivity, streamline repetitive coding tasks, and expand their knowledge—all while enhancing their coding efficiency and accuracy.

-

The main takeaway is that these tools are here to help you, not replace you. They can save you time and provide new insights, but they can’t replace your expertise and creativity. Always review the generated code, documentation, and tests to ensure they meet your project’s requirements.

-

Have fun !

-
-
-

Ressources

- -

I also thank my friend Arthur Bréant for giving me precious tips on how to use the tools presented in this article.

- - -
- -
- -
- - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/docs/posts/mycomicslibrary/index.html b/docs/posts/mycomicslibrary/index.html index 3a0c41f..0445cea 100644 --- a/docs/posts/mycomicslibrary/index.html +++ b/docs/posts/mycomicslibrary/index.html @@ -43,6 +43,7 @@ + + + +