<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nightingale</title><link>https://cying.org/blog/</link><description>Recent content on Nightingale</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 19 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cying.org/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Theme Feature Test</title><link>https://cying.org/blog/2026-05-18-theme-feature-test/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2026-05-18-theme-feature-test/</guid><description>&lt;p>This post tests all theme features: footnotes, table of contents, images, figures, code blocks, tables, and blockquotes.&lt;/p>
&lt;h2 id="headings-and-toc">Headings and TOC&lt;/h2>
&lt;p>The table of contents on the right sidebar is generated from &lt;code>h2&lt;/code>, &lt;code>h3&lt;/code>, and &lt;code>h4&lt;/code> headings. On wide screens, &lt;code>h3&lt;/code> and &lt;code>h4&lt;/code> are nested under their parent &lt;code>h2&lt;/code> with a collapsible toggle.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;h3 id="nested-level-3-heading">Nested Level 3 Heading&lt;/h3>
&lt;p>This is a level-3 heading nested under the first H2. It should appear indented in the TOC.&lt;/p></description></item><item><title>与AI相关</title><link>https://cying.org/blog/2025-09-19-ai-related/</link><pubDate>Fri, 19 Sep 2025 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2025-09-19-ai-related/</guid><description>&lt;div style="border-left: 4px solid #2b6cb0; padding: 0.5em 1em; margin: 1em 0 2em 0; background: #ebf4ff;">
&lt;h2 id="review-summary">Review Summary&lt;/h2>
&lt;p>&lt;strong>Overall:&lt;/strong> 一篇关于 AI 能力与局限性的真诚个人反思。作者基于一手使用经验提出的担忧具有现实意义，行文流畅，但存在个别事实性错误和结构可优化之处。&lt;/p>
&lt;p>&lt;strong>Critical issues:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&amp;ldquo;GPT5&amp;rdquo; 并非已发布模型——截至本文日期（2025年9月）及当前（2026年5月）均未发布&lt;/li>
&lt;li>&amp;ldquo;AI的问题&amp;quot;首段信息密度过高，&amp;ldquo;两个问题&amp;quot;作为本节核心论点被淹没在文字中&lt;/li>
&lt;li>&amp;ldquo;无时无刻&amp;quot;缺少否定搭配，语义与作者本意相反&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Annotations:&lt;/strong> 4 条标注——见下方内联区块。&lt;/p>
&lt;/div>
&lt;h2 id="ai的问题">AI的问题&lt;/h2>
&lt;p>自从对话式AI出来以后，我就一直使用AI辅助我的工作与学习。最初，我觉得AI很强大，好像什么都懂，但是随着我的使用，我发现AI的能力是有问题的，即使是现在最顶级的通用大模型，Gemini 2.5 Pro, 以及GPT5, 也存在很多问题。&lt;/p>
&lt;p>我对AI的机制不太清楚，但是似乎是依据前面的文字，推断下一个哪个文字的概率是最大的(这似乎也解释了为什么即使使用同样的提示词，模型还是会给出不完全一样的回答)。如果是这种机制的话，就算它表现得出来似乎是能够理解自然语言，但是其本质还是没有思考能力的。以前我听到一个什么理论，如果一个东西长的像鸭子，叫的也像鸭子，那它就是一个鸭子。这个理论似乎可以套在很多东西上；如果以结果为导向作为评价结果，这句话好像没什么问题，实际上很多问题也的确是以最终结果为导向的。但是用这个理论套在大模型上，真认为大模型具有思考能力，我认为是不太合理的。如果仅仅认为两个东西表现的相似就认为他们是同一个东西，显然太过片面。大模型似乎更像是一个极其强大，对大量信息能够进行搜索的引擎。如果用于训练的数据，某个观点的内容比较多，它似乎更倾向于在一个问题上表现出该观点。当然，我觉得这就是大模型的用处。当你询问它问题时，它可以陈述出现有的所有观点，让我们快速了解已有的知识。但这也是问题所在，在我的使用过程中，有两个问题，我觉得是无法解决的。&lt;/p>
&lt;div style="border-left: 4px solid #e53e3e; padding: 0.5em 1em; margin: 1em 0; background: #fff5f5;">
&lt;p>&lt;strong>[Accuracy]&lt;/strong> &amp;ldquo;GPT5&amp;rdquo; 并非已发布的模型。截至本文日期（2025年9月），OpenAI 发布的最新模型为 GPT-4o 和 o1 系列；截至当前（2026年5月），GPT-5 仍未发布。&lt;/p>
&lt;p>&lt;strong>Principle:&lt;/strong> 在论述中引用具体产品名称时，应确保该产品确实存在且已公开发布。OpenAI 官方文档（platform.openai.com）中不包含 GPT-5，最新公开可用的前沿模型为 GPT-4o 及 o1/o3 推理系列。&lt;/p>
&lt;p>&lt;strong>Correction:&lt;/strong> 将 &amp;ldquo;GPT5&amp;rdquo; 替换为当时已实际发布的模型名称（如 &amp;ldquo;GPT-4o&amp;rdquo; 或 &amp;ldquo;o1&amp;rdquo;），或使用泛指如&amp;quot;最新的 GPT 系列模型&amp;rdquo;。&lt;/p></description></item><item><title>miscellaneous tricks in r</title><link>https://cying.org/blog/2024-02-12-miscellaneous-tricks-in-r/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2024-02-12-miscellaneous-tricks-in-r/</guid><description>&lt;p>About a year ago, I decided to stop using &lt;code>dplyr&lt;/code> for data processing and switched to using &lt;code>data.table&lt;/code>. One important reason is its more concise syntax in most situations and faster performance. Another reason is that using tidy-like code often involves loading many packages, leading to a miscellaneous workspace. Tidy-like code typically involves repeating some behaviors in base R but provides a unified interface for performing tasks more conveniently and rigorously.&lt;/p></description></item><item><title>ggplot2 advance</title><link>https://cying.org/blog/2024-01-18-ggplot2-advance/</link><pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2024-01-18-ggplot2-advance/</guid><description>&lt;h2 id="layers-as-object">layers as object&lt;/h2>
&lt;p>对于ggplot2而言每一层的图形都是一个R对象， 这些对象通过函数&lt;code>+&lt;/code>堆叠在一起形成最终的对象。既然每一层都是一个对象，常规的R的操作对于其应该也是起作用的。对于 &lt;code>+&lt;/code>操作，最常见的就是累加的操作了，对于ggplot2的对象来说也是可以这么操作的。&lt;/p>
&lt;p>考虑你使用&lt;code>pROC::roc()&lt;/code>计算了n个变量的AUC表现，该函数返回一个长度为n的列表；每一个列表元素包含了对应变量的specificities 以及 sensitivities. 如果你想用ggplot在一幅图中画出每个变量的ROC曲线，一般的作法是把每个变量的specificities以及sensitivities的结果合并在同一个数据框，然后对每条曲线使用不同颜色映射以区分不同的变量。如果你不想整理数据，一种方法如下：对列表的每一个元素创建对应的ggplot2对象，然后将其累加起来，构建最终的对像。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">Reduce&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">`+`&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">Map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.color&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dt&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.table&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">specificities&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">.x&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">specificities&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sensitivities&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">.x&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">sensitivities&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_path&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dt&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">specificities&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sensitivities&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">color&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">.color&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">linewidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">annotate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.65&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">.y&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">label&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">sprintf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%s AUC: %s&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.x&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">auc&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">color&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">.color&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">hjust&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span> &lt;span class="c1"># 对每一个变量的AUC曲线，设置不同的颜色(palette)，以及注释&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">},&lt;/span> &lt;span class="n">re5roc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">palette&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">seq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.05&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0.2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">by&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.05&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">re5roc&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">init&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ggplot&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nf">geom_segment&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xend&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">yend&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">color&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;red&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">linetype&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;dashed&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="wrap-ggplot2-function">wrap ggplot2 function&lt;/h2>
&lt;p>在ggplot2的&lt;code>aes&lt;/code>函数中都使用了非标准性计算(NSE)，如果你想对&lt;code>aes&lt;/code>传递参数, 则应该使用&lt;code>{{}}&lt;/code>包裹这些参数。
关于NSE的讨论可以参考&lt;a href="https://adv-r.hadley.nz/">Advanced R&lt;/a>。一个例子见&lt;a href="https://cying.org/en-work/2023/06/wrap-ggplot2-function/">这里&lt;/a>。&lt;/p>
&lt;p>另一个封装ggplot2函数的问题在于&lt;code>...&lt;/code>参数的传递。当你的函数试图创建多个ggplot2 components，你必须区分&lt;code>...&lt;/code>里的参数是传递给哪个component。一种解决办法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">geom_mean&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bar.params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">errorbar.params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bar.params&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">modifyList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bar.params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">errorbar.params&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">modifyList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">errorbar.params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bar&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;stat_summary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">modifyList&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fun&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;mean&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geom&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;bar&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;grey70&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bar.params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">errorbar&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;stat_summary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">modifyList&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fun.data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;mean_cl_normal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geom&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;errorbar&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0.4&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">errorbar.params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bar&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">errorbar&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mpg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cty&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_mean&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">colour&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;steelblue&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">errorbar.params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">linewidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mpg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cty&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_mean&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bar.params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;steelblue&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">errorbar.params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">colour&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;blue&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="internals-of-ggplot2">Internals of ggplot2&lt;/h2>
&lt;p>需要明确的是，当你在对你的&lt;code>ggplot&lt;/code>函数添加一层层的图的操作与画图无关，而更多是创建一个用于画图的对象，当你&lt;code>print&lt;/code>是该对象才被用于绘图；该对象需要经过&lt;code>ggplot2::ggplot_build()&lt;/code>对其进行处理用于生成处理后的数据，最后经过&lt;code>ggplot2::ggplot_gtable()&lt;/code>最终生成绘图数据。&lt;/p>
&lt;p>统计绘图的本质在于统计量的分布；对于&lt;code>ggplot2&lt;/code>而言其&lt;code>geom_&lt;/code>以及对应的&lt;code>stat_&lt;/code>函数将对原数据的统计量的计算以及其对应的几何图形整合在一起，掩盖了计算统计量的结果。为了得到统计量的结果，我们可以手动的生成的&lt;code>ggplot2&lt;/code>进行&lt;code>ggplot2::ggplot_build&lt;/code>的构建。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">set.seed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">123&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dt&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.table&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">rnorm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mean&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dt[&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nf">rnorm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">20&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dt&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_point&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_smooth&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">method&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;lm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">formula&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">~&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">stat&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">ggplot_build&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">stat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">data[[2]]&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要注意的是，ggplot2会先对数据进行所有的&lt;code>scale&lt;/code>操作然后再进行各种统计计算，例如如果添加了&lt;code>scale_x_log10&lt;/code>函数，则其先对原数据进行&lt;code>log10&lt;/code>映射，然后再进行统计量的计算。&lt;/p></description></item><item><title>graph visualization</title><link>https://cying.org/blog/2023-11-08-graph-visualization/</link><pubDate>Wed, 08 Nov 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-11-08-graph-visualization/</guid><description>&lt;p>From &lt;a href="https://rviews.rstudio.com/2019/03/06/intro-to-graph-analysis/">here&lt;/a>&lt;/p>
&lt;p>&lt;code>tydygraph&lt;/code>提供了用于图数据处理的tidy工作流的接口，&lt;code>ggraph&lt;/code>提供了用于图数据可视化的&lt;code>ggplot2&lt;/code>工作流的工具。&lt;/p>
&lt;h2 id="tidygraph">&lt;code>tidygraph&lt;/code>&lt;/h2>
&lt;p>&lt;code>tidygraph::as_tbl_graph()&lt;/code>, 用于将一个数据框及其类似的数据结构转换为图数据 —— 这个数据框包含一列称为&lt;code>from&lt;/code>， 以及一列称为&lt;code>to&lt;/code>的变量，用于描述节点（nodes/vertex)之间的相互关系，其它的列是对连接线（edge）的描述信息。&lt;/p>
&lt;p>可以简单的理解为在经过&lt;code>as_tbl_graph&lt;/code>后，得到的图数据结构包含两张表。第一张表用于描述节点信息，其第一列是对原始数据框&lt;code>from&lt;/code>, &lt;code>to&lt;/code>两类中的节点去重得到。第二张表包含有连接线的信息，其是对原始数据框的复制，但是它的&lt;code>from&lt;/code>，以及&lt;code>to&lt;/code>变量中的节点名称由原来的名称被节点在第一张表中的排序所替代。&lt;/p>
&lt;p>由于图数据结构中有两张表，所以如果想要改变其中的信息，则需要确定想要改变的是描述节点信息的表还是描述连接信息的表，示例如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 修改用于描述节点信息的表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 修改用于描述连接信息的表&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果想要应用一些图算法，在该图数据之上，步骤如下&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>Start with a graph table&lt;/li>
&lt;li>Temporarily transform the graph to comply with the model that is requested (morph())&lt;/li>
&lt;li>Add additional transformations to the morphed data using dplyr (optional)&lt;/li>
&lt;li>Restore the original graph table, but modified to keep the changes made during the morph&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>当你在&lt;code>morph&lt;/code>函数中调用算法时，图数据结构会变成适合该算法输入的形式，然后返回一个新的图数据，你可以操作此图数据，就像其它任何图数据一样，然后返回原始数据，但是保留在&lt;code>morph&lt;/code>期间的修改。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">shortest&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">graph_routes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># find the shortest path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">morph&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">to_shortest_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">from&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">weights&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">journey_time&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># only node and edge in the returned morph data mutated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_node&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_edge&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">unmorph&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_node&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ifelse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_node&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_edge&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ifelse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_edge&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">arrange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_edge&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="ggraph">ggraph&lt;/h2>
&lt;p>&lt;code>ggraph&lt;/code>提供了用于可视化图数据的一系列类似于&lt;code>ggplot&lt;/code>的函数。其大致的用法如下&lt;/p></description></item><item><title>virtual machine profile</title><link>https://cying.org/blog/2023-10-03-virtual-machine-profile/</link><pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-10-03-virtual-machine-profile/</guid><description>&lt;p>&lt;strong>建议直接使用WSL2&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html">这里&lt;/a>下载vmware playrer，&lt;a href="https://ubuntu.com/download/desktop">这里&lt;/a>下载ubuntu镜像。打开vmware，按照提示一路选择操作既可。&lt;/p>
&lt;blockquote>
&lt;p>之前下载的是vmware player, 但是后来设置网络时候，发现这玩意并不好用，好多教程都是使用vmware workstation示例，让我想起这以前刷到过的帖子 - 为什么vmware 网上的密钥好多都可以用。尝试了以下，只能说的确可以用，还很多。&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>虚拟主机设置主机v2ray代理&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://segmentfault.com/a/1190000039918994">vmware设置网络模式为桥接模式&lt;/a>。&lt;/p>
&lt;p>物理主机中运行&lt;code>ipcongfig&lt;/code>查看WLAN ipv4地址。v2ray中开启允许局域网连接，查看局域网socket, http端口号。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">ipconfig
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>虚拟主机中在 Settings -&amp;gt; Network -&amp;gt; Network Proxy中设置为mannual在http, https前一栏中填入物理主机的ipv4地址，后一栏中填入v2ray中查看的http端口号。在socket的第二栏中填入v2ray中查看的socket端口号。&lt;/p>
&lt;p>&lt;strong>中文输入设置&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://askubuntu.com/questions/1408873/ubuntu-22-04-chinese-simplified-pinyin-input-support">From network&lt;/a>&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>Open Settings, go to Region &amp;amp; Language -&amp;gt; Manage Installed Languages -&amp;gt; Install / Remove languages.&lt;/li>
&lt;li>Select Chinese (Simplified). Make sure Keyboard Input method system has Ibus selected. Apply.&lt;/li>
&lt;li>Reboot&lt;/li>
&lt;li>Log back in, reopen Settings, go to Keyboard.&lt;/li>
&lt;li>Click on the &amp;ldquo;+&amp;rdquo; sign under Input sources.&lt;/li>
&lt;li>Select Chinese (China) and then Chinese (Intelligent Pinyin).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>外观&lt;/strong>&lt;/p></description></item><item><title>recursive operations</title><link>https://cying.org/blog/2023-10-01-recursive/</link><pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-10-01-recursive/</guid><description>&lt;p>In most cases, we can traverse data by loop according to its index; and most languages provide syntatic-sugar for the iteration of such data, such as list comprehension in python and &lt;code>let i in array&lt;/code> grammar in javascript. However, the recursion is needed if you want to traverse unstructured data, such as list in R, dictionary in javascript, and object in javascript.&lt;/p>
&lt;p>The recursion on such complex data comonly includes a &lt;code>if else&lt;/code> structure; the first case is your desired behavior on objects&amp;rsquo;s specified children node; the second is the recursive case that is loop over the data and recursion on each element. a example from &lt;a href="https://javascript.info/recursion#recursive-traversals">modern javascript&lt;/a>&lt;/p></description></item><item><title>wrap ggplot2 function</title><link>https://cying.org/blog/2023-06-26-wrap-ggplot2-funciton/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-06-26-wrap-ggplot2-funciton/</guid><description>&lt;p>I am recently wrapping some ggplot2 functions in my package &lt;a href="https://github.com/snowGlint/easybio">easybio&lt;/a> but encountered a problem; According to the &lt;a href="https://ggplot2-book.org/programming.html#introduction">documentation&lt;/a> and my knowledge of eval_tidy, we should do it like this to wrap a function with quoted arguments in a tidy-like function:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">f1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">color&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">({{&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">}},&lt;/span> &lt;span class="p">{{&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">}},&lt;/span> &lt;span class="p">{{&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="p">}}))&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_point&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This works well. However, when I want to add additional aesthetic arguments &lt;code>...&lt;/code> to the &lt;code>f1&lt;/code> function, it doesn&amp;rsquo;t seem to work. Instead of wrapping &lt;code>...&lt;/code> in &lt;code>{{}}&lt;/code>, no special operations need to be performed as if the &lt;code>...&lt;/code> argument is a common argument:&lt;/p></description></item><item><title>a bug caused by staying up late</title><link>https://cying.org/blog/2023-06-09-a-bug-caused-by-staying-up-late/</link><pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-06-09-a-bug-caused-by-staying-up-late/</guid><description>&lt;p>I accidentally confronted a bug in committing my modifications on my website —— my new blog on June 1 can&amp;rsquo;t be presented on my website; The blog was written at 2. am in China; After many possible fixes, I finally found that it was triggered by jet lag: China is 12 hours ahead of the United States, so when I committed a blog with June 1 announcement at 2. am in China, the hours in the United States was May 31st. No blog was written on June 1 when hours were May 31st. This reminds me of not burning the midnight oil&amp;hellip;&lt;/p></description></item><item><title>use conda</title><link>https://cying.org/blog/2023-06-06-use-conda/</link><pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-06-06-use-conda/</guid><description>&lt;p>查看系统信息，在&lt;a href="https://github.com/conda-forge/miniforge/releases/latest">这里&lt;/a>选择合适的版本下载。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uname -a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在服务器没有代理的情况下，建议直接从其它地方下载该文件，例如&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/">清华大学开源软件镜像&lt;/a>，免受1kb/s的折磨。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-L https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-o Mambaforge-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行&lt;code>bash Mambaforge-Linux-x86_64.sh&lt;/code> init? yes&lt;/p>
&lt;p>通过修改用户目录下conda的配置文件.condarc，可以改变conda的行为。考虑到国外镜像在没有代理的情况下，下载速度缓慢，可以在&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/">配置文件中添加如下语句，更改镜像为清华源&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">channels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">defaults&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">show_channel_urls&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">default_channels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">custom_channels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">conda-forge&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">msys2&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">bioconda&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">menpo&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pytorch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pytorch-lts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">simpleitk&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deepmodeling&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在&lt;a href="https://anaconda.org/">这里&lt;/a> 查软件下载命令&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mamba install r-base&lt;span class="o">=&lt;/span>4.3.1 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mamba install &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.14 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mamba install radian
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#.bashrc 中设置radian 别名pi: alias pi=&amp;#39;radian&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="nb">alias&lt;/span> &lt;span class="nv">pi&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;radian&amp;#39;&lt;/span> &amp;gt;&amp;gt; .bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>取消终端启动时自动启动conda, 也可以直接在.condarc文件中设置其值为false.&lt;/p></description></item><item><title>use git</title><link>https://cying.org/blog/2023-06-06-use-git/</link><pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-06-06-use-git/</guid><description>&lt;p>可以简单的认为github仓库及其分支，本地的仓库及其分支都是一份独立的资源。在每一份资源之上的每次提交都在资源中的一个版本，根据需要我们将仓库的版本合并同步。&lt;/p>
&lt;h2 id="git-configuration">git configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">git config --global user.name &amp;#34;xxx&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.email &amp;#34;706990@gmail.com&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --list # 列出所有配置信息
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="git与github连接">git与github连接&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">git remote add origin &amp;lt;https://github.com/person-c/easybio.git&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push -u origin main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git remote set-url origin new.git.url/here # 改变远端github地址
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">git branch -m master main #修改分支名master为main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="workflow">workflow&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">git clone # git clone 到本地
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git checkout -b xxx # 切换至新分支xxx（相当于复制了remote的仓库到本地的xxx分支上
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">修改或者添加本地代码（部署在硬盘的源文件上）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git diff # 查看自己对代码做出的改变
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add # 上传更新后的代码至暂存区
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit # 可以将暂存区里更新后的代码更新到本地git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin xxx # 将本地的xxxgit分支上传至github上的git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果在写自己的代码过程中发现远端GitHub上代码出现改变&lt;/p></description></item><item><title>learning with ai</title><link>https://cying.org/blog/2023-05-28-learning-with-ai/</link><pubDate>Sun, 28 May 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-05-28-learning-with-ai/</guid><description>&lt;p>Recently, ChatGPT is overwhelming the Chinees internet with many applications deployed. It not only supplies powerful abilities to process many boring and repetitive work many white collars do but also brings unemployment concerns for many people engaged in the internet field. What&amp;rsquo;s the future of the internet like? I don&amp;rsquo;t know, but I think it&amp;rsquo;s indeed a powerful tool to help us learn, especially in cases when what we want to know is something common but scattered across the internet which cost us much time to filter from many pages. AI&amp;rsquo;s performance in summarizing information from the internet is impressive, so it&amp;rsquo;s a useful tool for learning knowledge widespread existed on the internet, such as programming. I have tried to learn javascript for a few days, and the most annoying thing I encountered was many methods&amp;rsquo; arguments and usage, but I accidentally found Al can solve this problem perfectly —— just ask AI to give a concrete example of the method you want to learn, it can respond with a detailed description. Nice! AI can handle such specific questions perfectly, what we need to do is to design the whole theory structure we want to learn;&lt;/p></description></item><item><title>lazy evaluation in eval function</title><link>https://cying.org/blog/2023-05-22-lazy-evaluation-in-eval-function/</link><pubDate>Mon, 22 May 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-05-22-lazy-evaluation-in-eval-function/</guid><description>&lt;p>The lazy evaluation arguments in &lt;code>eval()&lt;/code> function indeed confused me for a few days. I realize that problem when I read the Learning R programming(the Chinese edition); There is a part of code like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">qs&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">range&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">range&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">substitute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">range&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">selector&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span>&lt;span class="nf">eval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">range&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">. &lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x[selector]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here, we create a function that quotes the range argument; then evaluate the range expression in a list environment that the dot&lt;code>.&lt;/code> represents the length of x. A concrete example is as follows:&lt;/p></description></item><item><title>ggplot2 scales</title><link>https://cying.org/blog/2023-03-17-ggplot2-scales/</link><pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-03-17-ggplot2-scales/</guid><description>&lt;p>ggplot2中所有映射都由scale_*函数控制, 使用&lt;code>vignette(&amp;quot;ggplot2-specs&amp;quot;)&lt;/code>查看所有的映射。&lt;/p>
&lt;h1 id="position-scales-and-axes">Position scales and axes&lt;/h1>
&lt;h2 id="numeric-positions-and-scales">Numeric positions and scales&lt;/h2>
&lt;p>&lt;strong>limits&lt;/strong> 控制x, y轴的范围。&lt;/p>
&lt;ul>
&lt;li>zooming in&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>NOTE: When you truncate the scale limits, some data points will fall outside the boundaries you set, and ggplot2 has to make a decision about what to do with these data points. The default behaviour in ggplot2 is to convert any data values outside the scale limits to NA. This means that changing the limits of a scale is not always the same as visually zooming in to a region of the plot. If your goal is to zoom in on part of the plot, it is usually better to use the xlim and ylim arguments of coord_cartesian(ylim = c(10, 35))&lt;/p></description></item><item><title>execute r script in linux</title><link>https://cying.org/blog/2023-01-12-execute-r-script-in-linux/</link><pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-01-12-execute-r-script-in-linux/</guid><description>&lt;ul>
&lt;li>&lt;a href="#argparse">argparse&lt;/a>&lt;/li>
&lt;li>&lt;a href="#read_yaml">&lt;code>read_yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#parallel">parallel&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>编写R软件。首先在脚本头部加入语句&lt;code>#! /usr/bin/env Rscript&lt;/code>指定bash。&lt;/p>
&lt;h4 id="argparse">argparse&lt;/h4>
&lt;p>R软件接受命令行参数，这里我使用r包argparse。这是依据python包写的，因此需要你的的环境里有python环境。如果需要生成帮助文档，则需要knitr包，而knitr包依赖于软件pandoc，所以你还需要下载pandoc。其简单的执行过程就是创建一个parser对象，调用其&lt;code>add_argument()&lt;/code>方法添加参数，然后将接收的命令行参数返回一个列表。&lt;/p>
&lt;p>命令行参数主要包括可选参数以及位置参数。&lt;br>
参数名的简写一般以符号&lt;code>-&lt;/code>开始，而其全称以符号&lt;code>--&lt;/code>开始。&lt;/p>
&lt;p>可选参数例子如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#! /usr/bin/env Rscript&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">argparse&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建参数解析对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">ArgumentParser&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第一个参数verbose，缩写为v，其作用是告诉脚本是否打印完整的计算过程，其缺省值为TRUE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;-v&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;--verbose&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">action&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;store_true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Print extra output [default]&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第二个参数quietly，缩写为q，其作用是修改verbose参数，当调用改参数时，verbose被修改为FALSE，从而导致不再打印计算过程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;-q&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;--quietly&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">action&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;store_false&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dest&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;verbose&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Print little output&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第三个参数count，缩写为c，这是一个整数参数，缺省值5，在后续的代码中被用作确定输出随机数的个数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;--count&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;integer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Number of random normals to generate [default %(default)s]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">metavar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;number&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第四个参数generator，无缩写，用于确定调用何种随机分布，缺省值rnorm对应于正态分布&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;--generator&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;rnorm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Function to generate random deviates [default \&amp;#34;%(default)s\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第五个参数mean，无缩写，浮点数，用于确定正态分布的均值，缺省值为0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;--mean&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;double&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Mean if generator == \&amp;#34;rnorm\&amp;#34; [default %(default)s]&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置第六个参数sd，无缩写，浮点数，用于确定正态分布的标准差，缺省值为1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;--sd&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;double&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">metavar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;standard deviation&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">help&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Standard deviation if generator == \&amp;#34;rnorm\&amp;#34; [default %(default)s]&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 返回接受的参数列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">args&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">args&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 根据verbose确定是否打印计算过程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">verbose&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;writing some verbose output to standard error...\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">stderr&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 根据其他参数，确定输出随机数的类型与次数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">generator&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;rnorm&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">cat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">rnorm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mean&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">sd&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">collapse&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="kr">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">cat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">generator&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">collapse&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">cat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后，我们需要使得这个脚本有执行权限，才可以执行该脚本。因此在终端输入命令&lt;code>chmod +x example.R&lt;/code>。然后就可以输入命令&lt;code>.example.R&lt;/code>运行该脚本。如果中间出现某些问题，你可能需要考虑你需要用到的软件是否在你的搜索路径PATH里面。&lt;/p></description></item><item><title>use rmarkdown to generate pdf in chinese</title><link>https://cying.org/blog/2023-01-12-rmd-to-pdf-in-chinese/</link><pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-01-12-rmd-to-pdf-in-chinese/</guid><description>&lt;p>为了使得Rmardown生成的PDF支持中文以及交叉引用等功能，在YAML头部需要做一些设置。pdf_documnent2格式是对普通pdf格式的增强，增加了交叉引用的支持。你可以通过&lt;code>?pdf_document2&lt;/code>查看该文档可以设置的选项。xelatex是对中文支持比较好的引擎。如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;pdf title&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">output&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">bookdown::pdf_document2&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">latex_engine&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">xelatex&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;2023-01-03&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">header-includes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> 
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">\usepackage{ctex}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">\usepackage{longtable}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>yaml头部的每一个域(filed)都是对文档格式某一类选项的设置，除了output下的内容，其它设置都是不依赖于输出文档类型设置。&lt;/p>
&lt;p>对code chunk的一些option，我们可以通过函数&lt;code>knitr::opts_chunk&lt;/code>统一设置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">```{r setup, include=FALSE}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">knitr::opts_chunk$set(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> echo = FALSE,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fig.width = 7,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fig.height = 5,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fig.align = &amp;#34;center&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">```
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一些常用的code chunk option:&lt;/p>
&lt;ul>
&lt;li>&lt;code>fig.show = 'hold'&lt;/code>，它告诉 R Markdown 不要拆分代码块，而是运行完全部代码后，把生成的图片依次附在下方。&lt;/li>
&lt;/ul>
&lt;p>knitr 1.35 及以后版本支持在代码块内部用 #| 符号 设置代码块选项，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">```
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#| echo: false
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#| fig.width: 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">plot(cars)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">```
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时我们还可以使用行内代码，例如 &lt;code>r nrow(mtcars)&lt;/code> ，该表达式会直接执行，将代码嵌入文档之中，进行文档的实时更新。&lt;/p></description></item><item><title>advanced r - meta programming</title><link>https://cying.org/blog/2023-01-10-adr-meta-programming/</link><pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2023-01-10-adr-meta-programming/</guid><description>&lt;h2 id="序">序&lt;/h2>
&lt;p>代码也是数据，可以用代码进行检查和修改。为了实现对代码数据的修改，我们需要区分代码数据和代码本身，毕竟它们在形式上是一致的。我们需要将代码用&lt;code>expr()&lt;/code>包裹，然后对这个返回的对象进行修改，这个返回的对象称之为表达式（&lt;em>expression&lt;/em>），也就是我们可以用于修改的代码数据。但是对于传入函数的参数，我们需要用&lt;code>enexpr()&lt;/code>对其进行包裹，才能返回表达式。表达式是一类数据的总称，包括四个方面的内容，&lt;em>call, symbol, constant, pairlist&lt;/em>。&lt;/p>
&lt;p>和其它语言一样，代码数据被抽象为类似树的结构，称为抽象语法树（&lt;em>abstract syntax tree&lt;/em>）。函数的调用为树的分支，树的叶子为&lt;em>symbol, contants&lt;/em>。一个例子如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">lobstr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">ast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">█─&lt;span class="n">`+`&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─&lt;span class="m">1&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─█─&lt;span class="n">`*`&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─&lt;span class="m">2&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─&lt;span class="m">3&lt;/span> 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>既然表达式是数据，那么我们就可以用代码生成该数据。其中一个生成&lt;em>call&lt;/em>表达式一个方法就是&lt;code>call2()&lt;/code>函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">call2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;f&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">f&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这方法比较简单，但是在构建比较复杂的表达式时比较困难。还有一种方法就是通过对简单表达式进行组合，形成比较复杂的表达式。为了组合不同的表达式我们需要使用特殊的符号&lt;code>!!&lt;/code>，该符号所进行的操作称为“解引用”。你可以将其理解为插入操作，其是在表达式中的一个特殊语法，只有在返回表达式的函数，例如&lt;code>expr()&lt;/code>中可以理解该语法，类似于&lt;code>R&lt;/code>中的胶水语法，可以将变量代表的表达式插入表达式。一个例子如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">xx&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">expr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">yy&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">expr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">expr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!!&lt;/span>&lt;span class="n">xx&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="o">!!&lt;/span>&lt;span class="n">yy&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对代码数据，即表达式，修改之后怎么执行呢？我们唯一需要做的就是定义这个表达式所在的环境，也就是对表达式的&lt;em>symbol&lt;/em>提供来源。&lt;em>baseR&lt;/em>提供了函数&lt;code>base::eval&lt;/code>用于执行表达式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">eval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">expr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">env&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你没有在&lt;code>base::eval&lt;/code>中定义环境，那么该函数会默认使用当前环境。手动执行表达式的好处在于，你可以自己定义执行的环境，这主要有两个用处：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>在写领域内特定的函数时，重写某些函数的定义，比如&lt;code>+&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>可以把数据框的变量作为环境(&lt;em>data mask&lt;/em>)。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>以下是一个重写函数定义的例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">string_math&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">env&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">caller_env&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`+`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`*`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">strrep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">eval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">enexpr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;Hadley&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">string_math&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="s">&amp;#34;Hello Hadley&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">string_math&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="s">&amp;#34;x&amp;#34;&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s">&amp;#34;-y&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="s">&amp;#34;xx-yxx-yxx-y&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>dplyr&lt;/code>把这一思想发挥到了极致，&lt;code>dplyr&lt;/code>会把&lt;code>R&lt;/code>在一个会将&lt;code>R&lt;/code>代码生成&lt;em>SQL&lt;/em>的环境中运行，然后在远端数据库中执行这些&lt;code>SQL&lt;/code>代码。&lt;/p>
&lt;p>当然，在环境中重新定义函数的意义需要很多的投入，我们更加常用的是，将表达式在数据框（数据框，列表，环境的结构类似）中执行（&lt;em>data mask&lt;/em>）。这里我们用&lt;code>rlang::eval_tidy&lt;/code>作为例子，&lt;code>base::eval&lt;/code>当然也可以做到，不过它具有某些缺点，我们后面再讨论。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">df&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">sample&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">eval_tidy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">expr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">6&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">7&lt;/span> &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>我们将它封装起来，就可以形成一个类似于&lt;code>base::with()&lt;/code>的函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">with2&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">expr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">eval_tidy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">enexpr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">expr&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">with2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">6&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">7&lt;/span> &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是这个函数有个问题，稍微修改一下这个函数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">with2&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">expr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">eval_tidy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">enexpr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">expr&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">df&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">$&amp;gt;&lt;/span> &lt;span class="nf">with2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="m">1001&lt;/span> &lt;span class="m">1002&lt;/span> &lt;span class="m">1003&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里的问题在于，当我们给函数传递参数的时候，我们希望的是它的值就是我们在外面定义的值，即&lt;code>a &amp;lt;- 10&lt;/code>。但是在执行时，函数显然使用的是&lt;code>with2&lt;/code>函数环境中的&lt;code>a &amp;lt;- 1000&lt;/code>。为了解决这个问题，我们引入一种新的数据结构&lt;code>quosure&lt;/code>。&lt;code>quosure&lt;/code>将表达式与它的环境绑定在一起，为了方便，我将&lt;code>quosure()&lt;/code>函数返回的数据称之为&lt;code>quosure&lt;/code>表达式，因为其除了用属性记录其环境以外，其它方面与之前提到的表达式并无区别。&lt;code>eval_tidy&lt;/code>函数正是为&lt;code>quosure&lt;/code>表达式而设计的，因为在使用&lt;em>data mask&lt;/em>时，引入了一个问题：在你执行表达式时，表达式中的变量&lt;code>x&lt;/code>的是来源于数据框还是环境呢？为了解决这个问题，&lt;code>eval_tidy&lt;/code>可以识别新的语法，即代词前缀。&lt;code>eval_tidy&lt;/code>中的表达式可以显式的指定变量的来源-&lt;code>eval_tidy(expr(.data$x + .env$y), df)&lt;/code>，这种表达式中使用代词前缀的语法，只有在&lt;code>eval_tidy&lt;/code>中可以识别，用于解决在使用&lt;code>data mask&lt;/code>时，表达式中歧义的问题。&lt;/p></description></item><item><title>advanced r - function</title><link>https://cying.org/blog/2022-10-23-adr-function/</link><pubDate>Sun, 23 Oct 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-10-23-adr-function/</guid><description>&lt;p>关于函数式编程语言，其一，需要有一类函数，也就是函数也是一个数据对象。其二，函数得是pure的。&lt;/p>
&lt;p>A pure function satisfies two property:&lt;/p>
&lt;ul>
&lt;li>The output only depends on the inputs, i.e. if you call it again with the same inputs, you get the same outputs. This excludes functions like &lt;code>runif()&lt;/code>, &lt;code>read.csv()&lt;/code>, or &lt;code>Sys.time()&lt;/code> that can return different values.&lt;/li>
&lt;li>The function has no side-effects, like changing the value of a global variable, writing to disk, or displaying to the screen. This excludes functions like &lt;code>print()&lt;/code>, &lt;code>write.csv()&lt;/code> and &lt;code>&amp;lt;-&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>函数按其输入以及输出划分，分为普通函数(regular function)，泛函(functionals)，函数工厂(function factories)，函数算子(function operator)。&lt;/p></description></item><item><title>environment setting</title><link>https://cying.org/blog/2022-08-17-enviroment-setting/</link><pubDate>Wed, 17 Aug 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-08-17-enviroment-setting/</guid><description>&lt;p>怎么定义环境，按我现在浅薄的认知就是一些参数配置，一个预先定义的值 key = value, 应用或环境在启动时从这里获取变量值，指定应用在执行时其需要的值。环境变量包括全局环境变量以及局部环境变量。全局环境变量，所有都可以获得的变量。 局部环境变量，某些可以获得这些值。在写代码时将一些敏感的变量值，独立出来作为预先定义的环境变量文件.env，并将其放入.gitignore，然后将代码上传到gitHub，以防止一些隐私信息泄露。另外初次接触bash脚本的人总是对各种命令感觉奇怪，其实这些命令只是函数的特殊形式，其后面可能会接一些其它东西，这些东西就是函数的参数。&lt;/p>
&lt;p>参考：&lt;br>
&lt;a href="http://www.cureffi.org/2014/01/15/running-r-batch-mode-linux/">linux下怎么运行R脚本&lt;/a>&lt;br>
&lt;a href="https://medium.com/chingu/an-introduction-to-environment-variables-and-how-to-use-them-f602f66d15fa">环境变量介绍以及使用&lt;/a>
&lt;a href="https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-set-environment-variables-in-linux/">Linux下怎么设置环境变量&lt;/a>&lt;/p></description></item><item><title>advanced r - oop</title><link>https://cying.org/blog/2022-08-14-adr-oop/</link><pubDate>Sun, 14 Aug 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-08-14-adr-oop/</guid><description>&lt;blockquote>
&lt;p>一切皆是对象。
一切皆是函数调用。&lt;/p>&lt;/blockquote>
&lt;p>以上所谓的对象时指R中所有的数据，包括函数都可以作为对象进行输入，下面所讨论的才是面向对象编程中的对象。&lt;/p>
&lt;p>R中有四种面向对象的结构，分别为S3,S4（R语言的前身为S语言）,RC(Reference Class,也称为R5),以及R6。其中前三种为R内置，R6由R6包提供。&lt;/p>
&lt;p>当我们讨论面向对象时，我们在讨论什么？首先我们具有一个类（class）的概念，这是一个抽象的集合，犹如当我们在讨论人类时。一个类可以拥有一个子类，犹如当我们讨论黄种人，白种人，黑种人之与人类，反之，人类之与黄种人即为父类。父类与子类之间具有继承关系。一个类如何决定它是该类？这是一个哲学问题，正如我如何定义我。在R中一个类的定义包括属性（filed),方法（methods),其中属性在语言上是一个键值对（key-value pair)的形式，为一个名词性的描述，而方法是动词性的，体现了该类具有的操作。当我们议论某雪，某爱豆时，这就是我们所谓的对象（object)，该对象是由某类实例化而来（initialize)，为一个具体确定的个体。对于类的属性以及方法的修改为modified-in-place,即对其本身的修改，而不是modified-in-copy（复制对象后修改，重新建立name和对象的指向）。当我们讨论赋值 &lt;code>&amp;lt;-&lt;/code>时，即是将一个name指向了一个对象，一个对象（针对RC,以及R6)被修改以后，所有指向它的name的值同时发生变化，即许多name共享一个对象，而该对象的修改是modified-in-place,那么通过任何一个指向该对象的name对该对象进行修改，其它指向该对象的name的值也同时发生变化。&lt;/p>
&lt;p>以上所讨论的面向对象在RC，以及R6中体现。S3，以及S4中的面向对象是通过泛型函数（generic)实现的。所谓泛型函数，即在一个函数名例如plot下，包括了多个函数Plot.xxxx, plot.yyy, plot.zzz，当我们调用plot函数时，该plot泛函自动识别输入对象的类型从而调用不同的Plot.*** 函数。该面向对象的实现方式，属性和方法进行了分离，在对象中仅定义了属性，而方法通过泛函与对象进行匹配。另外，只有S4对属性的调用使用符号 @。&lt;/p>
&lt;p>以下所有的内容来自&lt;a href="https://dataxujing.github.io/R_oop/">R语言面向对象编程 教程&lt;/a>&lt;/p>
&lt;h2 id="第一篇-基于s3的面向对象">第一篇 基于S3的面向对象&lt;/h2>
&lt;ol>
&lt;li>S3用起来简单，但在实际的面向对象编程的过程中，当对象关系有一定的复杂度，S3对象所表达的意义就变得不太清楚。&lt;/li>
&lt;li>S3封装的内部函数，可以绕过泛型函数的检查，以直接被调用。&lt;/li>
&lt;li>S3参数的class属性，可以被任意设置，没有预处理的检。&lt;/li>
&lt;li>S3参数，只能通过调用class属性进行函数调用，其他属性则不会被class()函数执行。&lt;/li>
&lt;li>S3参数的class属性有多个值时，调用时会被按照程序赋值顺序来调用第一个合法的函数。&lt;/li>
&lt;/ol>
&lt;h5 id="第一节--创建s3对象">第一节 创建S3对象&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pryr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#辅助工具，用于检查对象类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#通过变量创建S3对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#39;class&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#39;foo&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;class&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用pryr包的otype函数,检查x的类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">otype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 通过structure()函数创建S3对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">structure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;foo&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;class&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">otype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建一个多类型的S3对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;class&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;foo&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;bar&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">otype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="第二节-泛型函数和方法调用">第二节 泛型函数和方法调用&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用UseMethod()定义teacher泛型函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">UseMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;teacher&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用pryr包中ftype()函数，检查teacher类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ftype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">teacher&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="s">&amp;#34;s3&amp;#34;&lt;/span> &lt;span class="s">&amp;#34;generic&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义teacher内部函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher.lecture&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;讲课&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher.assignment&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;布置作业&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher.correcting&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;批改作业&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher.default&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;你不是teacher&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;teacher&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 给老师变量设置行为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;class&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#39;lecture&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 执行老师的行为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">teacher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> “讲课”
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 直接调用teacher中定义的行为，虽然没啥用。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">teacher.lecture&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第三节-查看s3对象的函数">第三节 查看S3对象的函数&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看teacher对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">teacher&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Usemethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;teacher&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看teacher对象的内部函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nf">methods&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">teacher&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="n">teacher.assignment&lt;/span> &lt;span class="n">teacher.correcting&lt;/span> &lt;span class="n">teacher.default&lt;/span> &lt;span class="n">teacher.lecture&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#通过methods()的generic.function参数，来匹配泛型函数名字&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nf">methods&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">generic.function&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">predict&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="n">predict.ar&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">......&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 通过methods()的class参数，来匹配类的名字&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">methods&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">lm&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]add1.lm&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">......&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用getAnywhere()函数,查看所有函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">getAnywhere&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">teacher.lecture&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用getS3method()函数，也同样可以查看不可见的函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">getS3method&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;predict&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;ppr&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第四节-s3-对象的继承关系">第四节 s3 对象的继承关系&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">node&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">UseMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;node&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">node.default&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="s">&amp;#34;Default node&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#father函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">node.father&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;father&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># son函数，通过NextMethod()函数只想father函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">node.son&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#39;son&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">NextMethod&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#定义n1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">n1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">structure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;father&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在node函数中传入n1,执行node.father()函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nf">node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="s">&amp;#34;father&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义n2，设置class属性为两个&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">n2&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">structure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;son&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;father&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在node函数中传入n2,执行node.son()函数和node.father()函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nf">node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">[1]&lt;/span> &lt;span class="s">&amp;#34;son&amp;#34;&lt;/span> &lt;span class="s">&amp;#34;father&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="第二篇-基于s4的面向对象">第二篇 基于S4的面向对象&lt;/h2>
&lt;h4 id="第一节-创建s4对象">第一节 创建S4对象&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 加载pryr包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pryr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基类Shape&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Shape&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">slots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;character&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;character&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ellipse继承Shape&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">contains&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Shape&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">slots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;numeric&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">prototype&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证radius参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setValidity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">object&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">object&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">!=&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">stop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;It&amp;#39;s note Ellipse&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">which&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">object&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">&amp;lt;=&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">stop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Radius is negative&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Circle继承Ellipse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Circle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">contains&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">slots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;numeric&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">prototype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Circle&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验正radius属性值要大于等于0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setValidity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Circle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">object&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">object&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">radius&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">stop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Radius is negative&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义area接口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setGeneric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;area&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">standardGeneric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;area&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义area的Ellipse实现&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;area&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">cat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Ellipse Area: \n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kc">pi&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nf">prod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义area的Circle实现&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;area&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Circle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">...&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">cat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Circle Area:\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kc">pi&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">radius^2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建实例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Ellipse&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;e1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e2&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Circle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;e2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 计算面积&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">area&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">area&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第二节-从一个已经实例化的对象中创建新对象">第二节 从一个已经实例化的对象中创建新对象&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">slots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;character&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;numeric&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建一个对象实例n1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;n1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">19&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 从实例n1中，创建实例n2，并修改name的属性值&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n2&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">initialize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;n2&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第三节-访问对象属性">第三节 访问对象属性&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">setClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">slots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;character&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;numeric&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 访问S4对象的属性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## [1] &amp;#34;a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## [1] &amp;#34;a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 错误的访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#a$name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#a[1]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第四节-查看s4对象的函数">第四节 查看S4对象的函数&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pryr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查work的类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ftype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">work&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 直接查看work函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">work&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看work函数的显示定义&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">showMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">work&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看Person对象的work函数现实&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">getMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;work&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查Person对象有没有work函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">existMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;work&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">hasMethod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;work&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="第三篇-基于rc的面向对象">第三篇 基于RC的面向对象&lt;/h2>
&lt;h4 id="第一节-创建rc对象">第一节 创建RC对象&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建Animal类，包括name属性,构造方法initialize（），叫声方法bark()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Animal&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">setRefClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Animal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fields&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;character&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">methods&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;Animal&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bark&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Animal::bark&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建Cat类，继承Animal类，并重写（overwrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#)了initialize()和bark()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Cat&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">setRefClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Cat&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">contains&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Animal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">methods&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;-&lt;/span> &lt;span class="s">&amp;#39;cat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bark&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;is miao miao&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建Dog类&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Dog&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">setRefClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Dog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">contains&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Animal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">methods&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;-&lt;/span> &lt;span class="s">&amp;#39;Dog&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bark&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;is wang wang&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建Duck类&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Duck&lt;/span>&lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">setRefClass&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Duck&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">contains&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Animal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">methods&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;-&lt;/span> &lt;span class="s">&amp;#39;Duck&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bark&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;is ga ga&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建cat实例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cat&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">Cat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cat叫声&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">bark&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第二节-rc对象实例化后的内置方法属性以及辅助函数">第二节 RC对象实例化后的内置方法，属性，以及辅助函数&lt;/h4>
&lt;ol>
&lt;li>内置方法&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>initialize类的初始化函数，用于设置属性的默认值，只有在类定义的方法中使用。&lt;/li>
&lt;li>callSuper调用父类的同名方法，只能在类定义的方法中使用&lt;/li>
&lt;li>copy复制实例化对象的所有属性&lt;/li>
&lt;li>initFields给对象的属性赋值&lt;/li>
&lt;li>field查看属性或给属性赋值&lt;/li>
&lt;li>getClass查看对象的类定义&lt;/li>
&lt;li>getRefClass()同getClass()&lt;/li>
&lt;li>show 查看当前对象&lt;/li>
&lt;li>export查看属性值以类为作用域&lt;/li>
&lt;li>import 把一个对象的属性值赋值给另一个对象&lt;/li>
&lt;li>trace跟踪对象中方法调用，用于程序debug&lt;/li>
&lt;li>untrace取消跟踪&lt;/li>
&lt;li>usingMethods用于实现方法调用，只能在类定义的方法中使用，这个方法不利于程序的健壮性，所以不建议使用。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>内置属性&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>self 实例化对象自身&lt;/li>
&lt;li>.refClassDef类的定义类型&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>辅助函数&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>new用于实例化对象&lt;/li>
&lt;li>help用于查询类中定义的所有方法&lt;/li>
&lt;li>methods列出类中定义的所有方法&lt;/li>
&lt;li>fields列出类中定义的所有属性&lt;/li>
&lt;li>lock给属性加锁，实例化的对象的属性只允许赋值依次，即赋值变量不可修改&lt;/li>
&lt;li>trace跟踪方法&lt;/li>
&lt;li>accessors给属性生成get/set方法&lt;/li>
&lt;/ul>
&lt;h2 id="第四篇-基于r6的面向对象">第四篇 基于R6的面向对象&lt;/h2>
&lt;h4 id="第一节-创建r6类">第一节 创建R6类&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Person&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">R6Class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">public&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">gender&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">self&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">private&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">gender&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">gender&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hello&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">self&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">private&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">myGender&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">member&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">self&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">private&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">ls&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">envir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">private&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">private&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gender&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">myGender&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">self&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;is&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">private&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">gender&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">conan&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">Person&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Conan&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Male&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">conan&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="nf">member&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="第二节-r6的主动绑定">第二节 R6的主动绑定&lt;/h4>
&lt;p>主动绑定(Active binding)是R6中一种特殊的函数调用方式，把对函数的访问表现为对属性的访问，主动绑定属于公有成员。在类的定义中，通过设置activate参数实现主动绑定的功能，给Person类增加两个主动绑定的函数activate和rand&lt;/p></description></item><item><title>advanced r - foundation</title><link>https://cying.org/blog/2022-06-25-adr-fundataion/</link><pubDate>Wed, 22 Jun 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-06-25-adr-fundataion/</guid><description>&lt;h2 id="names-and-values">Names and values&lt;/h2>
&lt;p>Name 指向 value;&lt;br>
保留字的问题，可以用反引号实现非合法的命名。&lt;/p>
&lt;p>&lt;strong>Copy-on-modify&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>函数调用，形参(name)指向了值(value)，对象（object).&lt;/li>
&lt;li>List（data.frame）的存储形式，每一个元素指向对应的object.&lt;/li>
&lt;li>Character vectors -&amp;gt; global string pools.&lt;/li>
&lt;li>1:10 -&amp;gt; alternative presentation.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Modify-in-place&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Object with a single binding&lt;/li>
&lt;li>Environments(a special data structure)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Garbage collector(gc)&lt;/strong>： 自动内存管理，没必要了解太多。&lt;/p>
&lt;p>总结：了解向量name, value之间的关系。实际上在R中想要避免修改对象时复制基本不太可能，除了环境这种特殊的数据结构具有reference semantics, 其它的R对象想要避免复制，只能通过对象仅有一个name(performance optimization)实现, 但是函数调用（除了primitive functions &amp;ndash; c functions)总会给R对象引入一个新的name，而且R对于R对象name的计数只用0，1，more，三种，也就是说一旦R对象有了2个name，对R来说该对象就有more个name,即使这时候R对象去掉一个name，对R来说 more -1 = more, 该对象仍有多个name,在修改对象时还是会对其进行复制。&lt;/p>
&lt;h2 id="vectors">Vectors&lt;/h2>
&lt;p>这里提到的向量是一类数据结构，是广义的向量，包括原子型向量(atomic vector)以及列表(lists)。&lt;br>
原子型向量和列表有什么区别呢？没有区别，除了原子型向量的每个元素必须相同，所以它们都是向量(Vector)。实际上列表的每个元素也是相同的，因为列表的每个元素都是指向其对象的的reference，只不过列表的每个元素存储的是指向不同对象的箭头。Null和向量的关系？Null代表了空的向量，或者缺失的向量，用于删除向量元素，或者作为函数的默认参数。&lt;/p>
&lt;p>属性（attributes)，是向量的额外数据(metadata)，为name-value的结构(list)，通过R对象的箭头指向我们就可以找到它的额外数据。属性一般都是暂时的，除了name(name也是属性，想不到吧）和维度。如果想要永久的保留属性，我们需要通过class属性创建自己的S3 object。&lt;/p>
&lt;p>Dimension attributes power atomic vector to matrix and array; list to list-matrices and list-arrays. Class attributes power atomic vector to factors, date, date-times, difftime vectors; list to date.frame and tibble.&lt;/p></description></item><item><title>tidyverse - loop and iteration</title><link>https://cying.org/blog/2022-06-17-loop-and-iteration-in-tidyverse/</link><pubDate>Fri, 17 Jun 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-06-17-loop-and-iteration-in-tidyverse/</guid><description>&lt;p>R中的map函数家族以及across函数都可以进行迭代操作。map函数适用于向量，列表，数据框（数据框是列表的特殊形式)多种数据结构，而across函数仅适用于对数据框进行修改操作。考虑map函数以及across函数对数据框的修改作用上来说，map函数适用于当数据框所有列都要同一函数修改的情况，而across函数当与mutate函数连用时适用于对数据框部分列进行同一函数修改，当与summarize函数连用时，适用于对数据框所有列进行修改或者选取指定列进行统计建模。虽然map函数家族也提供了modify_if函数，但是它的选择器写起来复杂，不如across函数的选择简单强大。&lt;/p>
&lt;p>mutate函数返回数据框并于原数据框进行并入处理，而summarize函数则是返回生成的新数据框。&lt;/p>
&lt;h2 id="函数式编程----map函数家族">函数式编程 - map函数家族&lt;/h2>
&lt;p>许多函数需要用函数作为参数，称这样的函数为泛函(functionals)。 典型的泛函是&lt;code>lapply&lt;/code>类函数。 这样的函数具有很好的通用性， 因为需要进行的操作可以输入一个函数来规定， 用输入的函数规定要进行什么样的操作。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>...&lt;/code> 形参
在R函数的形参中， 允许有一个特殊的&lt;code>...&lt;/code>形参（三个小数点）， 这在调用泛函类型的函数时起到重要作用。 在调用泛函时， 所有没有形参与之匹配的实参， 不论是带有名字还是不带有名字的， 都自动归入这个参数， 将会由泛函传递给作为其自变量的函数。 &lt;code>...&lt;/code>参数的类型相当于一个列表， 列表元素可以部分有名部分无名， 用&lt;code>list(...)&lt;/code>可以将其转换成列表再访问。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>匿名函数
&lt;code>purrr&lt;/code>包为在&lt;code>map()&lt;/code>等泛函中使用无名函数提供了简化的写法， 将无名函数写成“&lt;code>~ 表达式&lt;/code>”格式， 表达式就是无名函数定义， 用&lt;code>.&lt;/code>表示只有一个自变量时的自变量名， 用&lt;code>.x&lt;/code>和&lt;code>.y&lt;/code>表示只有两个自变量时的自变量名， 用&lt;code>..1&lt;/code>、&lt;code>..2&lt;/code>、&lt;code>..3&lt;/code>这样的名字表示有多个自变量时的自变量名。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>map&lt;/code>函数分类&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>变量个数 &lt;code>map_*&lt;/code> &lt;code>map2_*&lt;/code>,&lt;code>imap&lt;/code>, &lt;code>pmap_*&lt;/code>(parallel map)。&lt;/li>
&lt;li>返回类型 &lt;code>*_int&lt;/code>, &lt;code>*_dbl&lt;/code>, &lt;code>*_chr&lt;/code>, &lt;code>*_lgl&lt;/code>, &lt;code>*_dfc&lt;/code>, &lt;code>*dfr&lt;/code>, &lt;code>modify&lt;/code>, &lt;code>*walk*&lt;/code>。&lt;/li>
&lt;li>判断筛选 &lt;code>*_if&lt;/code>, &lt;code>keep&lt;/code>。&lt;/li>
&lt;li>多元运算 &lt;code>reduce&lt;/code>。&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>示性函数&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>some(.x, .p)&lt;/code>，对数据列表或向量&lt;code>.x&lt;/code>的每一个元素用&lt;code>.p&lt;/code>判断， 只要至少有一个为真，结果就为真； &lt;code>every(.x, .p)&lt;/code>与&lt;code>some&lt;/code>类似，但需要所有元素的结果都为真结果才为真。 这些函数与&lt;code>any(map_lgl(.x, .p))&lt;/code>和&lt;code>all(map_lgl(.x, .p))&lt;/code>类似， 但是只要在遍历过程中能提前确定返回值就提前结束计算， 比如&lt;code>some&lt;/code>只要遇到一个真值就不再继续判断， &lt;code>every&lt;/code>只要遇到一个假值就不再继续判断。&lt;/li>
&lt;li>&lt;code>detect(.x, .p)&lt;/code>返回数据&lt;code>.x&lt;/code>的元素中第一个用&lt;code>.p&lt;/code>判断为真的元素值， 而detect_index&lt;code>(.x, .p)&lt;/code>返回第一个为真的下标值。&lt;/li>
&lt;li>&lt;code>keep(.x, .p)&lt;/code>选取数据&lt;code>.x&lt;/code>的元素中用&lt;code>.p&lt;/code>判断为真的元素的子集； &lt;code>discard(.x, .p)&lt;/code>返回不满足条件的元素子集。&lt;/li>
&lt;/ul>
&lt;ol start="5">
&lt;li>在 &lt;code>map&lt;/code> 中提取列表元素成员的简写&lt;/li>
&lt;/ol>
&lt;p>在map中提取列表元素成员的简写&lt;/p></description></item><item><title>ggplot2</title><link>https://cying.org/blog/2022-06-15-ggplot2/</link><pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate><guid>https://cying.org/blog/2022-06-15-ggplot2/</guid><description>&lt;h2 id="ggplot设计理念">ggplot设计理念&lt;/h2>
&lt;p>&lt;em>ggplot: gramer of graphics&lt;/em>&lt;/p>
&lt;p>&lt;em>ggplot&lt;/em>的设计理念是从数据（&lt;em>data&lt;/em>)到几何图形(&lt;em>geom_&lt;/em>)属性的映射（&lt;em>mapping&lt;/em>），当我们绘图时我们所需要考虑的仅仅是哪些数据能够决定最终的图形，例如当绘制箱型图时，我们需要的一个向量的几个分位数便能够决定最终的图形，而定义这种从数据到图形属性的映射则是由标度（&lt;em>scale&lt;/em>）决定的，图例就是这一标度的体现;而从一个向量到最终绘图所需要的统计量则是由统计变化（&lt;em>stat_&lt;/em>)决定的，当向量没有进行统计变化时，我们称之为等值变化。以上四个部分：数据，统计变化，映射，几何图形，最后加上位置（&lt;em>position&lt;/em>）则构成了一个图层（&lt;em>layer&lt;/em>)。&lt;/p>
&lt;p>统计变化：&lt;br>
几何图形：按功能进行划分：表现数量，表现分布，比较，拟合曲（待续)&lt;br>
图形属性：位置（x,y轴), shape size, color fill, line width line type, alpah group.&lt;/p>
&lt;p>除了上面所提到的5个部分，&lt;em>ggplot&lt;/em>还有四个部件用于修饰图形：&lt;/p>
&lt;ul>
&lt;li>coord&lt;/li>
&lt;li>facet&lt;/li>
&lt;li>theme&lt;/li>
&lt;li>output&lt;/li>
&lt;/ul>
&lt;p>写在&lt;code>ggplot&lt;/code>里面，全局映射，写在几何形状里面，比如说&lt;code>geom_point&lt;/code>则为局部映射。&lt;br>
图片保存：&lt;code>ggsave&lt;/code>.&lt;/p>
&lt;h2 id="图层的三种实现方式">图层的三种实现方式&lt;/h2>
&lt;h4 id="图形语法geom_">图形语法——&lt;em>geom_&lt;/em>&lt;/h4>
&lt;ul>
&lt;li>Plot, the device containing your data: &lt;code>ggplot(data = mydata)&lt;/code>&lt;/li>
&lt;li>Specify the type of your graph and the variables to use: &lt;code>+geom_point(ase(x = body weight, y = wingspan))&lt;/code>&lt;/li>
&lt;li>Add labels and titles: &lt;code>+ labs(x = &amp;quot;body weight(g)&amp;quot;, y = &amp;quot;wingspan&amp;quot;, title = &amp;quot;heavy birds have long wings&amp;quot;)&lt;/code>&lt;/li>
&lt;li>Customize the look of your plot with themes &lt;code>+theme_bw()&lt;/code>&lt;/li>
&lt;/ul>
&lt;h4 id="统计变化语法stat_">统计变化语法——&lt;em>stat_&lt;/em>&lt;/h4>
&lt;blockquote>
&lt;p>尽管我们在谈论&lt;code>geom_*()&lt;/code>的局限性，从而衬托出&lt;code>stat_*()&lt;/code>的强大，但并不意味了后者可以取代前者，因为这不是一个非此即彼的问题，事实上，他们彼此依赖——我们看到&lt;code>stat_summary()&lt;/code> 有 &lt;em>geom&lt;/em> 参数, &lt;code>geom_*()&lt;/code> 也有 &lt;em>stat&lt;/em> 参数。 在更高的层级上讲，&lt;code>stat_*()&lt;/code>和 &lt;code>geom_*()&lt;/code> 都只是ggplot里构建图层的&lt;code>layer()&lt;/code>函数的一个便利的方法，用曹植的《七步诗》来说, 本是同根生，相煎何太急。&lt;/p></description></item></channel></rss>