csv格式用的不是comma所以在github上显示了一团,改成comma吧
新包 sinx:R 语言社区语录
dapengde 论坛的帖子链接这样做比较好,比如本帖的链接应该为 <https://d.cosx.org/d/420467>
而不是 <https://d.cosx.org/d/420467-cosx-fortunes> 因为后者会由于帖子修改标题发生变化,420467 是帖子的唯一 ID 这样做显得比较简洁,比如 <https://d.cosx.org/d/420198--/2> 可以变为 <https://d.cosx.org/d/420198/2>
yihui tctcab Cloud2016 谢谢各位的建议!大家如此热情,我这就找时间去改。
sinx......哈哈哈,挠到我的痒痒了。或者叫 fortunes2?sinx 理解起来有点曲折吧。不过如果大家觉得好玩也无所谓。以后可以继续开发姊妹篇 tanx,ctanx......
代码里确实问题很多,我来说说他们是怎么来的。
- 本来我没打算复制 fortunes代码的。因为
fortunes::fortune()
函数本身的设计是可以支持导入自定义语录文件的,所以照理说只需做个新的 .csv 文件就行了,根本用不着写个新包。然而可惜的是,fortunes::read.fortunes()
里使用read.table()
函数时没有指定编码,于是读入的中文语录就全乱码了(这可能也是 windows 用户独享的待遇)。这是问题 A。 - 针对问题 A,我修改了原来的代码,指定编码,读是读进去了,然后显示的时候,
fortunes:::print.fortune()
要求指定个 width 来折行显示,这个对中文又不支持。这是问题 B。 - 针对问题 B,我修改了原来的代码,忽略折行。
- LaTeX 部分函数,开始的时候我没看出来是干啥用的,就留在那里没碰。后来发现只是在写 vignette 时调用而已,于是就删了,改用 Markdown 生成 vignette。这算是 问题 C。
等改到这里的时候,我已经意识到还不如重写,然而既然已经能凑合用了,我就懒得重写了。于是分号分隔这些特点都继承下来了 tctcab 。当然,这个容易改,改成默认值,用户也可以自定义分隔符。
另一层面上, fortunes 是 CRAN 名下的包,于是有盲目崇拜心理,觉得人家官方的包肯定比我这外行从零开始写得好吧。我把修改版 PR 过去不就得了嘛,没必要另写一个包,然而这时才发现 cran/fortunes 项目居然是只读。
于是只好弄成了这个新包。新包对 fortunes 包是兼容的,可以读入 fortunes 的语录:
ftns <- cosx::read.cosxs(system.file("fortunes/fortunes.csv", package = "fortunes"))
cosx::cosx(cosxs.data = ftns)
这样,就可以很方便地把中外文语录合并起来了。而且,别的语种的用户就都可以使用 cosx 包了,只需自己做一个语录表,不必每次都重写——所以可能叫 fortunes2 更为妥当?
关于 Sys.setlocale("LC_CTYPE", "English")
,我平时基本不读入中文的文本文件,这次搞得我很头大。我发现,如果我的 windows 在区域语言里设置格式为 English,那么读入中文 csv 文件时要 read.table(encoding = 'UTF-8')
;如果 windows 在区域语言里设置格式为 Chinese,那么要 read.table(fileEncoding = 'UTF-8')
。于是我就用了 Sys.setlocale("LC_CTYPE", "English")
,一是图省事,二是为了兼容其他语种的 windows 环境。既然其他操作系统没有这个问题,那么我就先判断一下操作系统再执行得了。我的 linux 虚拟机被我折腾得挂掉了,一直没工夫修。
RStudio addin 界面录数据是个好主意,然而我不会做。哪位好汉来?
Cloud2016 论坛的链接居然还能这样?太好了。
- 已编辑
依照大家的意见,做了如下修改:
- 包名改为 sinx,然而目前我好像没有权限在 cosname 下创建 repo。安装:
remotes::install_github('pzhaonet/sinx', build = TRUE,
build_opts = c("--no-resave-data", "--no-manual"))
- 主要函数:
用法跟本帖一楼类似。详见各函数的帮助信息,或在线文档。sinx() # 一条语录 tanx() # 小动物说语录 ctanx() # 往 ~/.Rprofile 里添加一条代码,在 R 启动时随机显示一条语录 read.sinxs() # 读取语录文件 vignette('sinx') # 语录合集
需要多说一下的是,语录文件是可以随意扩展的,只需用 read.sinxs()
一次读入多个文件即可。下面这个例子,将 fortunes 包里的语录合并进来,一起显示:
path_f <- system.file("fortunes/fortunes.csv", package = "fortunes")
path_s <- system.file("sinxs/sinxs.csv", package = "sinx")
ftns <- sinx::read.sinxs(c(path_f, path_s), sep = c(";", ","))
sinx::tanx(sinxs.data = ftns)
- 语录集文件改为了逗号分隔。问题是怎么能在浏览器里避免横向滚动条而自动换行显示这个表格呢?
大家快来往语录集里 PR 啊!tctcab ,上!记得在 DESCRIPTION 里的作者字段添加自己的名字。
试着pull了一条,对github不熟不知道做的对不对【哭笑】
尝试了一下写个爬虫来根据 “https://d.cosx.org/d/420467-sinx-r/12” 这样的地址来生成sinx可用的记录,不过看起来评论内容是由js动态加载的,待我再研究一下rvest和phantomJS
[欢迎提供思路
- 已编辑
新增 secx()
函数,直接把语录文件转成 pagedown 或 bookdown 电子书如:<https://www.pzhao.org/book/cosx/> ,或 xaringan 幻灯片如 <https://www.pzhao.org/slides/cosx/> 。以后可以方便地用 excel 写 word 和 ppt 了!
新增六个语录包:
- 唐诗 tangshi
- 宋诗 songshi
- 金庸 jinyong
- 中文名言 chinese
- 英文名言 english
- 养生语录 yangsheng
于是:
jinyong <- read.sinxs(lib = 'jinyong')
tanx(sinxs.data = jinyong)
#>
#> -----
#> 一梦如是。
#>
#> --- 金庸 (天龙八部)
#> ------
#> ------
#> \ ^__^
#> \ (oo)\ ________
#> (__)\ )\ /\
#> ||------w|
#> || ||
可以合并显示:
libs <- read.sinxs(lib = c("tangshi", "songshi", "chinese", "yangsheng", "english","jinyong"))
tanx(sinxs.data = libs)
#>
#>
#> -----
#> 风吹柳花满店香,吴姬压酒唤客尝。
#> 金陵子弟来相送,欲行不行各尽觞。
#> 请君试问东流水,别意与之谁短长。
#>
#> --- 李白 (金陵酒肆留别)
#> ------
#> \
#> \
#> (.)_(.)
#> _ ( _ ) _
#> / \/`-----'\/ \
#> __\ ( ( ) ) /__
#> ) /\ \._./ /\ (
#> )_/ /|\ /|\ \_( [nosig]
详见在线帮助。
日期格式我改了。tctcab
语录库里还有些格式和文本小错误,我懒得挨个查了,欢迎大家 PR 修改,链接在这里。
运行一条 ctanx(lib = 'tangshi')
,就会在 ~/Rprofile
里添加一条相应指令,每次启动 R 时就可以读唐诗了。
可以在这个框架下制作各种语录,例如宋词啦、歌词啦、红楼梦选段啦、郭德纲相声……然后拿这些段子来测试 r markdown 的各种包。例如拿 pagedown 把 tangshi 做成一本书:<https://www.pzhao.org/book/tangshi/>
做了个 logo 和体恤衫。
- 已编辑
如果以 markdown 的格式接受大家的推荐语录 PR,会不会比 csv 格式更友好?省的考虑斜杠和引号之类的问题了。
所以我把原来的 sinxs.csv 转成了 sinxs.md。原来的 sinxs.csv 改名为 cosxs.csv 备用。包内部自动将 md 和 csv 相互转换。
还弄了个 cscx()
函数,运行它,会往剪贴板里拷一个骨架文本,直接 ctrl + v 来添加新语录。我不知道跟 csv 比起来哪个更方便。
author:
context:
source:
date:
---
如果 markdown 比 csv 更方便组织源文件,那这个包就太蠢了,因为它主要干的就是把 csv 里的源文本以像样的格式 如 markdown 展示出来……
不知为何 fortunes 包为何最初以分号分隔的 csv 文件来组织源语录。可能因为开发的时候还没出现 markdown?