r语言中六种方法查看R函数源代码—— 鼠标放在函数上,按下F2源码

微信公众号:生信小博士

加油~

1.最直接的方法当然是直接键入函数(不加括号),大部分函数源代码就可以直接显现出来。我以PerformanceAnalytics包中的函数chart.Correlation()为例。

2.在Rstudio里面,我们可以把光标放在函数名上按F2,Rstudio会打开一个新的窗口来显示这个函数:

2 用函数page(),不过,结果在另一个窗口显示,选择电脑上的程序打开,我的是Notepad++。

page(chart.Correlation)

3 与方法二类似,用函数edit()。这个函数一看就很有喜感,明显他是允许我们来修改函数的,这才是开源的真谛啊。修改了直接用。还是以我们这个函数为例。我们这个函数chart.Correlation是用来展示相关性的。但是她的参数很少,满足不了我的需求。

data(managers)
chart.Correlation(managers[,1:8],histogram=T,pch="+",col="black")

我把它设置字体的部分和调整散点图形状的部分稍作了修改,点击Save,这样一个新的函数mychart.Correlation就生成了。现在,我用同样的数据和参数来绘制这个图,达到了我的要求:

data(managers)

mychart.Correlation(managers[,1:8], histogram=T,pch="+",col="black")

4对于计算方法不同的函数,要用methods()来定义具体的查看对象,如查看函数mean代码,用方法一只能查到:
在这里插入图片描述

此时要有methods()来查找mean具体的对象:

methods(mean)

在这里插入图片描述
要查看具体名称,如mean.default的代码,直接用代码

mean.default

在这里插入图片描述
##*

注意

在这里插入图片描述
methods()得出的类函数中带星号标注的源代码,用函数getAnywhere(),如查找predict函数的源代码

getAnywhere(predict.Arima)

在这里插入图片描述

6 直接上CRAN 下载源代码包

流程如下:
1登入R主页 http://www.r-project.org/ ,点击 Download 下的CRAN;
2选择一个镜像;里面的Source Code for all Platforms下有各种源码了,对于程序包,点packages;

3.点选择项Table of available packages, sorted by name;
找到你你想要的包,点击看Package source这一项,用tar.gz封装的,下载解压后就能看见源代码了。

还可是使用debug模式代码源码

比如

debug(Seurat::Dotplot)

https://www.jianshu.com/p/ae68ae6c68dd

SM3是国国家密码管理局发布的一种密码算法,被广泛应用于数字签名、电子邮件安全、安全支付等领域。以下是一个示例的SM3加密C源代码: ```c #include <stdio.h> #include <string.h> typedef unsigned char BYTE; typedef unsigned long long UINT64; typedef unsigned long UINT32; #define FF(X, Y, Z) ((X) ^ (Y) ^ (Z)) #define GG(X, Y, Z) (((X) & (Y)) | ((X) & (Z)) | ((Y) & (Z))) #define ROTL(X, n) (((X) << (n)) | ((X) >> (32 - (n)))) const UINT32 T[64] = { 0x79cc4519, 0xf3988a32, 0xe38cb14b, 0xeac02d03, 0x4cce963d, 0xc5fdef28, 0x1f2fce41, 0x3ec93f5a, 0x97a3e243, 0xdc3db448, 0xd1f4acb1, 0x16a4e635, 0x135ccb0e, 0x46ecd320, 0x79cc4519, 0x536fd9a0, 0x3c8eed39, 0xfd339fa2, 0xcdaf722b, 0x283d3b14, 0x2e8f9b0d, 0xbc72c230, 0xb88f9f59, 0xfdfbcd22, 0x3d43106b, 0x5c4dd124, 0x76bcdf9d, 0x989141d6, 0xe4ccebaf, 0x5ed26898, 0x3f6314b1, 0x92cc39e8, 0x0d4a8551, 0xff126808, 0x44c131f1, 0x85efc719, 0x7703e3e0, 0xa2f77db9, 0x0a759c12, 0x8db7a5fb, 0x8007fbde, 0x4352d310, 0x1120e333, 0x1d95d49c, 0xa82b34e5, 0x89e4d0cc, 0x36efd4f7, 0xb6ac4b3e, 0x844e5787, 0x7609e918, 0xe345e16f, 0x28c21413, 0x2a8f9b1a, 0x8ff6e1f3, 0xb9ec857c, 0x891b8c65, 0x5873f2bd, 0xbde6cc75, 0xcaeefd5e, 0x76f988da, 0x0bf8f6b1, 0x70e44324, 0xe9d4fdae, 0xdabe6d5d }; void SM3Padding(BYTE *input, UINT32 inLen, BYTE *output, UINT32 *outLen) { UINT32 paddingLen = (448 - ((inLen * 8) % 512) + 512) % 512; *outLen = inLen + paddingLen / 8 + 32; memcpy(output, input, inLen); output[inLen] = 0x80; for (UINT32 i = inLen + 1; i < *outLen - 32; i++) { output[i] = 0; } UINT64 lengthBits = inLen * 8; output[*outLen - 32] = (lengthBits >> 56) & 0xff; output[*outLen - 31] = (lengthBits >> 48) & 0xff; output[*outLen - 30] = (lengthBits >> 40) & 0xff; output[*outLen - 29] = (lengthBits >> 32) & 0xff; output[*outLen - 28] = (lengthBits >> 24) & 0xff; output[*outLen - 27] = (lengthBits >> 16) & 0xff; output[*outLen - 26] = (lengthBits >> 8) & 0xff; output[*outLen - 25] = lengthBits & 0xff; } void SM3Hash(BYTE *input, UINT32 inLen, BYTE *output) { BYTE padding[64]; UINT32 paddingLen; SM3Padding(input, inLen, padding, &paddingLen); UINT32 n = paddingLen / 64; BYTE B[64]; UINT32 V[8], W[68], W1[64]; for (int i = 0; i < 8; i++) { V[i] = 0x7380166f; } for (UINT32 i = 0; i < n; i++) { memcpy(B, padding + i * 64, 64); for (int j = 0; j < 16; j++) { W[j] = (B[j * 4] << 24) | (B[j * 4 + 1] << 16) | (B[j * 4 + 2] << 8) | B[j * 4 + 3]; } for (int j = 16; j < 68; j++) { W[j] = ROTL(W[j - 16] ^ W[j - 9] ^ (ROTL(W[j - 3], 15)), 1) ^ (ROTL(W[j - 13], 7)) ^ W[j - 6]; } for (int j = 0; j < 64; j++) { W1[j] = W[j] ^ W[j + 4]; } UINT32 A = V[0], B = V[1], C = V[2], D = V[3], E = V[4], F = V[5], G = V[6], H = V[7]; for (int j = 0; j < 64; j++) { UINT32 SS1 = ROTL((ROTL(A, 12) + E + ROTL(T[j], j % 32)), 7); UINT32 SS2 = SS1 ^ ROTL(A, 12); UINT32 TT1 = FF(A, B, C) + D + SS2 + W1[j]; UINT32 TT2 = GG(E, F, G) + H + SS1 + W[j]; D = C; C = ROTL(B, 9); B = A; A = TT1; H = G; G = ROTL(F, 19); F = E; E = P0(TT2); } V[0] ^= A; V[1] ^= B; V[2] ^= C; V[3] ^= D; V[4] ^= E; V[5] ^= F; V[6] ^= G; V[7] ^= H; } for (int i = 0; i < 8; i++) { output[i * 4] = (V[i] >> 24) & 0xff; output[i * 4 + 1] = (V[i] >> 16) & 0xff; output[i * 4 + 2] = (V[i] >> 8) & 0xff; output[i * 4 + 3] = V[i] & 0xff; } } int main() { BYTE input[] = "abc"; BYTE output[32]; SM3Hash(input, strlen((char *)input), output); printf("SM3 Hash: "); for (int i = 0; i < 32; i++) { printf("%02x", output[i]); } printf("\n"); return 0; } ``` 该代码实现了SM3密码算法的关键部分,其包括了填充函数SM3Padding和哈希函数SM3Hash。代码使用了旋转左移运算(ROTL),逻辑运算以及位运算等操作实现了SM3算法的各个步骤。在main函数,我们以 "abc" 的输入为例进行加密,得到输出结果作为SM3的哈希值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信小博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值