估计阅读时长: 3 分钟

https://github.com/rsharp-lang/R-sharp

今天在这里给大家介绍的是一些在R#脚本语言编程之中的一些高级语法,关于R#语言的一些基础语法,大家可以阅读R#语言教程系列的第一篇《R#语言简明教程

对于R#脚本与R脚本语言之间的关系,大家可以将R#语言看作为R语言的一个超集,相似于TypeScript语言与JavaScript语言之间的关系。在这篇文章中,我主要向大家介绍在R#语言之中针对R语言的一些不足进行的改进部分。

错误捕捉与错误处理

对于任意一种编程语言,都会存在对于错误的捕捉处理。例如在VisualBasic语言之中的Try Catch语句块:

Try
    ' code that may throw unexpected exception
Catch ex As Exception
    ' handle exception
End Try

在传统的R语言之中,也存在着相对应的tryCatch函数(在R语言之中,并没有对应的语法进行错误的捕捉与处理)来处理错误。例如:

tryCatch({
    # code that may throw unexpected exception
}, error = function(ex) {
    # handle exception
});

在R#语言之中,针对错误的捕捉处理这一块进行了提升。大家可以通过类似于VisualBasic类似的Try Catch语法进行错误的捕捉与处理:

# just catch exception
x = try({
    # code that may throw unexpected exception
    # this block of code that may be returns a
    # try-error object
});

# handle exception
x = try(ex => {
   # code that may throw unexpected exception
}) {
   # handle exception ex
}

可以看到,在R#脚本语言之中,对错误的捕捉与处理都统一到了一个try语句块之中。如果希望在捕捉到了error信息之后,还进行后续的处理,可以在try语句块的后面添加一个closure表达式进行错误的处理。

实际上,添加了错误处理的closure表达式是与下面的表达式代码是等价的:

x = try({
    # code that may throw unexpected exception
});

x = if (typeof(x) == "try-error") {
    # handle unexpected exception
} else {
    x;
}

在R#脚本语言之中的这个语法改进,是不是相对于原来的R语言在语言的简洁程度上提升了很多?

Switch语句

在R#脚本语言之中,也存在着与传统的R脚本类似的Switch语句块。只不过在传统的R脚本语言之中的Switch语句块,并没有专门的针对于未匹配的选项的处理代码。而在R#语言之中则专门针对这个方面进行了加强:

const eval as function(type, x) {
    switch(type, default -> stop(`invalid option: ${type}`)) {
        # the identifier name at here is the
        # string literal value, actually
        mean           = mean(x),
        max            = max(x),
        "user-defined" = user(x)
    }
}

# passed
eval("user-defined", [1,2,3,4,5]);

# this expression will throw exception
# as the option 'xxxxx' is not matched 
# in the switch closure
eval("xxxxx", [1,2,3,4,5]);

序列生成语法

在R#脚本语言之中,保存着一个与R脚本语言之中较为一致的序列生成语法,例如下面的代码都可以在R或者R#的解释器环境之中被正常的执行:

1:100

上面的序列生成语法产生的数据间隔默认是1,但是假若我们需要产生数据间隔为0.5的数据呢。在R脚本之中由于没有对应的语法进行数值间隔的设置,所以必须要使用seq函数来生成。但是在R#脚本之中,则专门针对这一个功能进行了语法改进,现在你可以使用step关键词进行数值间隔的设置。下面的R#序列生成语法与seq函数的功能是一致的:

x = 1:100 step 0.5;
y = seq(1, 100, 0.5);

all(x == y);
# [1] TRUE

专门的正则表达式字符串处理语法

在R脚本语言之中,使用正则表达式会非常的麻烦,而在R#脚本语法之中,则专门针对使用正则表达式进行字符串的处理进行了语法设计:

如果我们想要进行正则表达式匹配的话,在R#脚本之中可以直接将正则表达式当作为一个函数进行使用,例如使用下面的语法进行字符串的正则表达式匹配:

$"[a-z]+\d+"(["x1+x2", "bbb"]);
# [1] "x1" ""

需要注意的是,使用上面的语法进行字符串正则表达式模式匹配,仅仅会返回第一个匹配上的子字符串结果。如果需要匹配上所有的结果,则需要使用matches函数来完成:

$"[a-z]+\d+"
|> matches(["x1+x2", "bbb"]);
# [[1]]
# [1] "x1" "x2"
# [[2]]
# NULL

例如我们想要查看目标字符串是否是完全属于目标正则表达式的匹配规则,则可以直接使用等价操作符进行判断,例如下面的两个表达式产生的结果是等价的:

["abc", "x1"] == $"[a-z]+\d+";
# [1] FALSE TRUE

x = $"[a-z]+\d+"(["abc", "x1"]);
# [1] "" "x1"
x == ["abc", "x1"];
# [1] FALSE TRUE

上面的语法是进行正则表达式模式匹配判断,实际上在R#脚本语言之中还存在着一个与上面的正则表达式匹配判断类似的通配符匹配的语法。这个通配符匹配的语法是使用的like操作符来完成的:

["abc", "axxxx", "x1"] like "a*";
# [1] TRUE TRUE FALSE

4 Responses

Leave a Reply

Your email address will not be published. Required fields are marked *

博客文章
June 2023
S M T W T F S
 123
45678910
11121314151617
18192021222324
252627282930  
  1. […] 在上面所提到的线性变化转换过程,其实就是一个热图绘制的过程。我们一般按照不同的颜色谱做线性变换映射,就可以得到对应的不同颜色系列下的NRRD热图成像渲染结果。对于NRRD图像文件的热图成像渲染原理,其实是和质谱成像的渲染原理一摸一样的(对于质谱成像渲染而言,其主要的原理也就是将对应的扫描点上的目标离子的intensity值取出,构建出一个和NRRD文件中的光栅矩阵数据一摸一样的矩阵数据,基于这个矩阵数据进行线性变换映射到对应的颜色值完成热图成像可视化操作)。 […]

  2. […] 如果我们需要将得到光栅矩阵数据进行可视化,该怎样做呢?其实,如果我们了解过热图成像或者质谱成像的原理的话,实际上对于这个光栅矩阵的原始数据进行成像的原理应该就会很清楚了。在我们拿到这个矩阵之后,可以将矩阵的行和列看作为二维图像空间之中的x和y坐标信息,然后对应的矩阵中的单元格值可以映射为一个对应的颜色,即可将从NRRD文件之中拿到的光栅矩阵数据给可视化出来。将光栅矩阵中的数值映射为对应的颜色值的方法原理,大家可以参考一下《【热图数据可视化】颜色插值计算原理》的内容介绍,一摸一样。 […]