继续学R:Vector(向量) Part 1, 多元素向量创建&类型

在之前的文章中,学习了《R的6大基本数据类型(原子向量)》,既然说到基本类型,那么肯定就有复杂类型喽,今天我们要说的就是Vector(向量),咦,怎么又是Vector(向量)?

别急,之前的文章中介绍的向量是最最基本的向量,今天的介绍的向量是指原子向量和原子向量组成的向量(多元素向量)。

多元素向量创建

原子向量之前的文章介绍过,我们就不用多说了,今天来学一下多元是向量,看字面的意思就很好理解了,就是多个元素组成的向量呗。

创建:使用c()函数

创建多元素向量有好多方法,最常用的就是使用c()这个函数,例如:

v<-c(1, 2, 3)
print(v)
print(class(v))

上述代码输出以下结果:

从上述代码以及对应结果来看,我们知道了多元素向量的类型取决于元素的类型,和我预想的打印出Vertor大相径庭,看来还是要多尝试呀。

创建:使用冒号操作符(:)

除了使用c()函数,我们还可以对数字类型(numeric/integer/complex)使用冒号操作符(:),例如:

v<-1:5; print(v); print(class(v));
v<-1.2:5.9; print(v); print(class(v));
v<-1L:5L; print(v); print(class(v));
v<-1:"5"; print(v); print(class(v));
v<-1:5+2i; print(v); print(class(v));

输出如下:

注意其中的类型变化,挺有意思的

创建:使用seq()操作符

别问我为啥c()是函数,而seq()叫操作符,我也迷糊,不过这不影响我们使用。

使用seq()操作符创建多元素向量的列子如下:

v<-seq(5, 9, by = 0.4); print(v);

多元素向量类型

再回到使用c()函数创建多元素向量的例子,我们在那得出结论:多元素向量的类型取决于元素的类型,那么问题来了?如果c()函数中传入的是不同的类型,那么最终多元素向量的类型是啥?例如:

v<-c(1L, 1.8); print(v); print(class(v));

执行上述代码,结果如下:

也就是说,对于不同类型的元素,最终会被转换成相同的类型

那么问题又来了,转换是按什么规律转换的呢?经过我不懈努力,终于找出如下规律(转换优先级排序):

raw > logical > integer >numeric >complex > character

举例俩简单例子:

v= c(TRUE, charToRaw("Hello")); print(v); print(class(v));
v= c(2, charToRaw("Hello")); print(v); print(class(v));


好了,今天就到这里了,学太多了,怕消化不良。

相关链接


This page is synchronized from the post: 继续学R:Vector(向量) Part 1, 多元素向量创建&类型

两行代码将老版本steem-python 程序迁移到AppBase

三个多月以前我发帖说AppBase相关的内容:《体验一下 Steem 0.19.4 & condenser_api》,3天以前又发帖说了JUSSI《JUSSI: 想说爱你并不是很容易的事》

变化

之所以时隔三个月又老话重提,实在是最近steem节点变化比较大,导致我的一些代码出了很多意想不到的BUG。

举例来讲,三个月之前steemd的代码里还看不到任何condenser_api相关的字样,大部分api还是在database_api中,如果我们调用了condenser_api实则是通过jussi重写规则生成的database_api调用。

而现今,steemd代码中已经有独立的condenser_apidatabase_api以及其它一些传统的api中大部分功能都放到了condenser_api中。老式的对database_api 的调用是通过jussi重写规则生成的condenser_api调用。

是不是有点晕?我也晕了😵

节点

因为上述变化以及JUSSI的存在,现在各个节点的状况比较混乱,主要有以下几个方面:

  • 节点版本不同 (有的尚未做上述改变)
  • 节点是否集成了JUSSI(未集成的节点不存在重写)
  • JUSSI的版本

因为上述原因,不同节点行为会有很大的差异,简单来讲,你的程序使用A节点可以工作,到B节点可能就会出现异常。即便使用A节点可以工作,还要防备哪天节点A升级到新版本。

steem-python

尽管不同版本的节点以及节点是否集成了JUSSI、集成了哪个版本,可能会导致程序行为不一致,但是往新版本新规则上靠拢总是没有大错的,尽管紧跟官方的步伐可能有点累。

这两天我的两个程序出现了一些异常,我调试发现,是因为我安装的老版本steem-python中大量功能还是使用database_api 进行的调用。对于集成JUSSI的节点,需要JUSSI对调用进行重写转发,而对于未集成JUSSI的节点,则会类似Could not find method xxx的错误。

升级steem-python或许是一种方法,但是我安装的版本自己改动的较多,并且代码都很熟悉了,新版本的steem-python改动较大,需要去测试后才能应用于生产环境。

另外一种做法是对steem-python中的每个方法进行修改,显式地指定api,比如说condenser_api,但是涉及修改的地方太多了,无力去逐一修改。所以想了个取巧的方法。

http_client.py中对应处加入如下代码:


当然了,以上修改只不过是应急之选,升级steem-python版本或许才是正确方案。不过上述方案无疑是最适合我的,不然谁知道过几天又要改什么,先这么用着吧,好用就好。

权且记录下来备忘,有相同问题的朋友也可以拿去参考。先声明,程序改坏了,我不负责哦😀


This page is synchronized from the post: 两行代码将老版本steem-python 程序迁移到AppBase

继续学R:R的6大基本数据类型(原子向量)

在学一门编程语言时,避免不了要和数据打交道,那么数据在这门语言中是如何存储和使用的呢?这就涉及到了数据类型。

R对象 & 原子向量

R语言中使用R对象(R-object)来存储数据,常见的R对象有:

  • 向量 / Vectors
  • 列表 / Lists
  • 矩阵 / Matrices
  • 数组 / Arrays
  • 因子 / Factors
  • 数据帧 / Data Frames

其中向量 / Vectors是最基本的R对象,有六种类型的原子向量(atomic vectors),分别是: 逻辑型/logical、整型/ integer、数字/numeric、复数/complex、字符/character、原生/raw

原子向量对比

我个人理解原子向量就好比其它编程语言中的基本数据类型,除了直接使用以外还可以用于构造其它复杂的数据类型,这里我先不研究那些复杂的类型都咋玩,先来对比一些这些基本类型吧。

在这之前,我们先介绍一个函数class(),这个函数作用是返回对象的类型,大概和Python中的type()类似吧,比如print(class(1))会返回

[1] “numeric”

下边我通过一个表格来对比一下这6大原子类型,并且标注出对应的Python语言中的类型
类型|例子|代码|输出|Python类型
—-|—-|—-|—-|—-
整型/ integer|1L, 100L|v<-100L; print(class(v));|[1] “integer”|int
数字/numeric|123, 123.45|v<-123.45; print(class(v));|[1] “numeric”|float
复数/complex|3 + 2i|v<-3 + 2i; print(class(v));|[1] “integer”|complex
逻辑型/logical|TRUE, FALSE|v<-TRUE; print(class(v));|[1] “logical”|bool
字符/character|’a’, “abc”, ‘abc’|v<-"abc"; print(class(v));|[1] “character”|str
原生/raw|”Hello” is stored as 48 65 6c 6c 6f|v<-charToRaw("Hello"); print(class(v));|[1] “raw”|bytes

由此看来,R中的6大原子类型和Python中的类型也差不多啦(请叫我差不多先生)。

赋值

因为例子代码中用到了赋值语句,所以多啰嗦两句,很多编程语言都是使用诸如:var = 1 类似的赋值方式。R语言的赋值让我好一通迷糊:一是好多赋值符号;二是支持向右赋值。

向左赋值

向左赋值可以使用:
=
<-
<<-

向右赋值

向右赋值可以使用:
->
->>

至于这些符号有啥区别,我找了一下,找到一些相关文章,但是没详细去研读,用到的时候再说吧,列到相关链接里了,反正现在我知道的这些已经够我用的啦😀

相关链接


This page is synchronized from the post: 继续学R:R的6大基本数据类型(原子向量)

我上辈子一定是个瓦匠

中午午睡了一小会,原本是打算休息一下,结果睡醒之后发现疲倦无比,浑身酸痛,于是不由地回想了一下梦里我都干了些什么,还别说这一想,还真回想起了梦里的大部分内容。


(图源 :Bing.com)

在梦里,我不再是一个半吊子程序员,也不是什么宅男,也不是有着体面工作的白领,当然了更不是大腹便便的官员政要。我有了一个从未体验过的崭新职业:瓦匠。

在梦里我有了一块空地,我突然记不得这块空地是我自己的还是我的雇主的,如果是我自己的,那么我就不是瓦匠了而是地主了😍。好吧,不纠结空地所有权的问题了,我现在要做的事情是要在空地上盖一栋房子。

空地的地基已经打好了(咦,谁帮我打好的?)然后我在地基上开始砌墙。混凝土也有人给我准备好了(人呢?)砖头一垛垛地码放得整整齐齐(这么说我不用干搬砖的体力活了?)有了这么好的条件,我砌墙砌的那叫一个欢快啊。

很快我就在空地上砌起了4面约1米高的围墙,然后我发现一个很严重的问题,我的围墙砌得歪歪扭扭不是那么笔直呢?这样可不行,让别人看到我这歪歪扭扭的围墙,岂不是有有损我的一世英名啊。于是我把围墙又统统拆除,然后我想了一个办法,在每面围墙的两端扯上一根线,然后沿着线砌。

我哼着欢快的歌曲,很快有砌起了4面约1米高的围墙,然后我又发现一个很严重的问题,围墙虽然笔直,可是四面围墙被我砌成了平行四边形,疏忽呀。于是拆掉,这次我运用我掌握的数学知识勾股定理,勾三股四弦五,一个完美的直角出来了。继续,一个长方形的围墙底子打好了。

我哼着欢快的歌曲,很快有砌起了4面约1米高的围墙,然后我又发现一个很严重的问题,尽管我的房子轮廓是长方形,直角精确到90°,然而我这个长方形和邻居们的房子朝向不一致,人家都是朝南向的,我的却是朝南偏西了10多度,但看没啥,但是和邻居们一排房子放一起看,就不协调了,哎,拆掉重建。

我哼着欢快的歌曲,很快有砌起了4面约1米高的围墙。然后我又发现一个很严重的问题,我忘记留门的位置了。还好这次不用完全拆掉了,只需在门口位置拆除一部分砖即可,于是开工拆除。

拆啊拆啊,我累得腰酸背痛,也哼不出来欢快的歌曲了,哎,这砌砖盖房子原来也不是件简单的事啊,想想还要继续砌下去,还有按门窗,还要做屋顶,还要在墙面贴瓷砖,还要在室内进行装修等等。哎,怎么这么麻烦,感觉比编程序还麻烦呢?

等等,编程序?编程序是什么东东?我不是一个瓦匠吗?可是为什么觉得编程这个词语这么耳熟呢?我使劲想啊想啊,咦,我的空地呢?我的房子呢?我的混凝土呢?我的砖呢?我怎么躺在床上呢?起来揉揉太阳穴,看着电脑桌上还在亮着的屏幕,以及书架上的编程书,怎么感觉恍然如梦呢?


(图源 :Bing.com)

彻底清醒过来之后,我坐在电脑桌前,继续码我尚未完成的代码,咦,这么有这么大一个BUG呢?哎,删掉重写吧。午睡没休息好,砌墙好累啊😟


This page is synchronized from the post: 我上辈子一定是个瓦匠

继续学R:另一款在线R环境

原本想着试试而已,这一接触,发现R挺好玩呀,让人欲罢不能啊,我已经控制不住我自己了,那就继续学吧。

Ideone

在 @dapeng 的一个帖子中,他推荐了一个免安装的R环境: ideone


试了一下这个 ideone,支持好多编程语言,果然是个好东西。然而我测试R画图,却啥都没有给我生成。

大鹏的帖子中还提到一个 Rweb,然而试了一下print("Hello World!")却给我一个大大的Internal Server Error,累觉不爱。

Tutorialspoint

搜索R的学习资源时,发现一个非常好的教学网站tutorialspoint,里边好多各种语言的教程啊,只有你不想学的,没有网站上没有的!

R Tutorial & Execute R Online

当然R教程也毫无疑问的列在这个网站上,R Tutorial。除了这个R Tutorial,最令人激动的是网站上提供了在线R环境


随便拿了一段生成饼图的代码,效果如上,是不是很方便?不过这个在线R环境也不是无所不能,比如说不能自己安装库😳,不过这也很正常,随便搞的话,岂不是要坏了。

Online R IDE

尽管在线R环境已经很强大了,但是如果管理更复杂的项目就麻烦一点了,这个网站还提供一个强大的Online R IDE

其它语言在线环境

除了R环境,tutorialspoint还提供了各种其它语言的在线编程环境,感兴趣的自己去玩吧。

相关链接


This page is synchronized from the post: 继续学R:另一款在线R环境

Telegram X 被封鸟

搜索一下我之前计划去弄Telegram bot的帖子,已经过去了三个多月了,最终我只弄了一个Telegram Echo 机器人就草草了事。说起来完成的这个机器人,论技术含量,大概与我学R里的Hello World!类似吧。

之所以拖延这么久,或者说会一直拖延下去,实在是因为Telegram X的“使用体验”不太好,而这个所谓的使用体验不好,更多是体现在连接性上,没错,我时不时的连不上。

之前初识Telegram X的时候,我还特意发帖推荐了一下: 《推荐一下电报 X,登录后无需科学上网》。登录后无需科学上网就可以使用,这是多么奇幻的事情啊,让人兴奋之余又难以置信。

不过现在好了,不用再难以置信了,因为这个奇幻的事情已经不复存在了,我已经连续好多天无法直接连到Telegram X上了。所以事实无外乎两种,要么是Telegram X被封鸟,要么就是它从来就没有通畅过,以往我的无需科学上网就可以使用,要么是幻觉,要么是一场梦。

我还记得20多年前刚刚接触互联网的时候,那时候被常常提起的一个词汇:地球村,在网络上,地域的距离将不是障碍,人与人之间可以自由畅快地沟通。20多年前,我用蹩脚的英语在ICQ、YAHOO通等聊天工具上和不知道年龄不知道性别不知道外貌的人一起畅聊时,我真的觉得我们都是地球村的村民。

然后,村里修建了公路,有的人家开起饭店茶馆,有人的人家开起了娱乐中心,有的人家尚武,有的人家爱好和平,有的人家暴富,有的人家赤贫,不过这些都还好,至少我们依然在同一个地球村,尽管财富、地位不等,但是我们依旧可以畅所欲言。

然而,不知道何时起,一道道围墙将我们阻隔了开来。至于建围墙的目的,或许是暴富的人家怕人盯上被抢又或许是赤贫的人家怕被人知道丢人。总之,地球村再也不是我们心目中的地球村了。

Google.com 之类的,我们这些老油条还享用过一段时间,至于Facebook啥的,很多人大概一直都是只闻其名。或许围墙外边真的遍地洪水猛兽,即便有一些花花草草,没准都是如罂粟一般看着美丽,实则有毒。那个啥Facebook,不上也罢。

可是,我就想和朋友聊聊天啊(好吧,其实我Telegram X只有零星的好友),其实我就想写个电报机器人玩玩啊,它被封了,我可咋玩啊?不过换个角度想想,其实也挺好,我终于不用为电报机器人难产找借口了,这真的不是我拖延啊。😭

咦,我都说了些什么乱七八糟的东西?这一定不是我敲出来的!还是用1987年中国发送的首封电子邮件内容结尾吧:

Across the Great Wall, we can reach every corner in the world!

相关链接


This page is synchronized from the post: Telegram X 被封鸟

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×