精华内容
下载资源
问答
  • R语言笔记7:functions——编写函数所需基础知识

    万次阅读 多人点赞 2018-03-21 14:03:23
    上一讲通过三个简单例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数知识。 Functions in R 主要分三个部分来讲解函数: 编写函数所需基础知识 相关语法作用域 R语言作用规则 ...

    上一讲通过三个简单的例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数的知识。

    Functions in R

    主要分三个部分来讲解函数:

    • 编写函数所需的基础知识
    • 相关语法作用域
    • R语言作用域的规则

    编写函数所需的基础知识

    R语言通过function()指令来命名和创建函数。首先要给函数赋值,也就是命名,然后在小括号中写入参数,最后再大括号中写入函数要执行的语句,其基本语法是:

    f <- function(<arguments>){
        ## Do something interesting
    }

    同时在R中,你可以将函数作为参数传递给其他函数,即嵌套。

    函数的返回值是函数执行部分中的最后一行表达式。

    编写函数的过程中我们可以设置和命名参数,这些参数可以代表数值、矩阵、数据框或逻辑值等等。同时也可以设置一些具有缺省值(默认值)的参数。

    • 形式参数(formal arguments)

    形式参数是包含在函数定义里的参数。

    formals()会将一个函数作为输入(input),并返回函数所有的形式参数组成的列表。

    在R中,不是所有命令都用到所用的形式参数。加入一个函数中设置了10个参数,但我们往往并不需要指定每个参数的值是啥,所以函数可以缺失某些参数。当没有明确赋值是,它的取值就是缺省值(默认值,default value)

    • 匹配参数(argument matching)

    可以根据位置或名称来匹配函数参数,这是编写和调用函数的关键。

    以计算数据标准差的函数sd()为例。

    > data <- rnorm(100)    ## 取100个符合正态分布的随机数
    > sd(x = data)          ## 给参数赋值 求标准差
    [1] 1.035329
    > sd(data)              ## 给参数默认赋值
    [1] 1.035329
    > sd(data, na.rm = FALSE)
    [1] 1.035329
    > sd(na.rm = FALSE, data)  ## 调换参数位置后结果不变
    [1] 1.035329

    以上所有表达式都是等价的,但是最好不要调换参数位置。

    如果函数中参数较多,那么最好使用位置匹配。

    比如lm()函数(把数据拟合到线性模型),它的参数列表这么长:

    > args(lm)
    function (formula, data, subset, weights, na.action, method = "qr", 
        model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
        contrasts = NULL, offset, ...) 
    NULL

    前五个参数都没有缺省值,依次是,公式、数据、子集、权重等。这里使用者必须要指定他们的值。

    lm(y ~ x, mydata, 1:100, model = FALSE)

    大多数情况下,我们不知道参数的具体位置,所以在命令行中,命名参数来匹配最安全。

    The order of operations when given an argument is:

    1. Check for exact match for a named argument
    2. Check for a partial match
    3. Check for a positional match
    • 惰性求值(Lazy Evaluation)

    惰性求值是R语言的一个关键特性,也是许多编程语言常用的模型。仅在使用函数参数时对其求值。

    第一个例子:

    > f <- function(a, b) {
    +         a^2
    + } 
    > f(2)
    [1] 4

    这里定义函数f,有两个参数,但返回值仅仅是a的平方。所以当运行f(2)时,和b无关,所以系统自动跳过,不会报错。

    第二个例子:

    > f <- function(a, b) {
    +         print(a)
    +         print(b)
    + }
    > f(45)
    [1] 45
    Error in print(b): argument "b" is missing, with no default

    这里同样定义f有两个参数,但返回值是a和b,所以当输入f(45)时,因为第二个位置上缺少b的赋值,所以会报错。这里就是用了惰性求值,即,仅在使用这个参数的时候进行求值,在这之前的程序都是有效的并可以执行,直至运行到出错的部分。

    • 特殊参数...

    ...参数是一种特殊的参数,表明一些可以传递给另一个函数的参数。常用于当你需要扩展另一个函数,而你又不想复制原函数的整个参数列表时。

    如下例,你希望修改plot()函数中的个别参数,而其他参数保持不变,将其应用于一个新定义的函数中myplot()

    myplot <- function(x, y, type = "l", ...) {
            plot(x, y, type = type, ...)         ## Pass '...' to 'plot' function
    }

    在泛型函数(generic function)中,...还有另一种用法,它的作用是根据数据类型使用合适的方法

    泛型函数是一个函数族,其中的每个函数都有相似的功能,但是适用于某个特定的类。

    > mean
    function (x, ...) 
    UseMethod("mean")
    <bytecode: 0x5d5e3e8>
    <environment: namespace:base>

    还有一种情况下,...参数必须使用:

    那就是,当传递到函数的参数数量不能事先确定的时候。

    比如paste()函数,他的作用是将一连串字符串连接起来,然后新建一个字符串或向量,所以无法预知参数个数:

    > args(paste)
    function (..., sep = " ", collapse = NULL) 
    NULL

    还有cat()函数,它的功能是和paste相似,也是连接字符串。

    > args(cat)
    function (..., file = "", sep = " ", fill = FALSE, labels = NULL, 
        append = FALSE) 
    NULL

    使用...函数的一个注意事项:

    就是任何出现在...之后的参数列表必须明确的给出名称。而且不能够部分匹配或位置匹配

    举例:

    > paste("a","b",sep = ":")
    [1] "a:b"

    不能位置匹配或部分匹配:

    > paste("a","b",":")
    [1] "a b :"
    > paste("a","b",se = ":")
    [1] "a b :"

    参考资料:
    1. 视频课程 R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome
    2. 讲义 Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R

    展开全文
  • Linux下R语言参数传递

    千次阅读 2019-01-29 11:47:14
    Linux下构建R语言统计模型,前端输入参数,后端获取接受参数,运行程序脚本得到分析结果。都离不开参数传递。参数传递分为形参和是实参。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被...

    Linux下构建R语言统计模型,前端输入参数,后端获取接受参数,运行程序脚本得到分析结果。都离不开参数的传递。参数传递分为形参和是实参。

    形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。

    实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。

    linux下的R语言的参数传递,可理解是将A值传入到B值中。 大致过程如下:

    1.首先linux界面执行脚本和参数序号,如下所示:

    Rscript   test.R   参数1   参数2 ...
    

    2.在test.R 脚本中进行参数获取系统中得到Args的序号对应数值:

    Args <- commandArgs()
    

    上述的commandArgs(),是R自带的参数传递函数**,属于位置参数。**运行Rscript后test.R脚本中将得到Args[1]和Args[2]的含义值。

    Args[1]= "参数1"
    Args[2]= "参数2"
    

    3.操作演示方法一:

    [root@tandelin home]# vi test.R
    
    Args <- commandArgs()
    print(Args[1])
    print(Args[2])
    

    保存后,在参数终端执行

    [root@tandelin home]# Rscript test.R input1 input2
    

    运行查看结果

    [root@tandelin home]# Rscript test.R $input1 $input2
    [1] "/usr/lib64/R/bin/exec/R"
    [1] "--slave
    

    4.操作演示方法二:

    [root@tandelin home]# input1=10
    [root@tandelin home]# input2=20
    

    赋值参数传入运行:

       [root@tandelin home]# Rscript test.R $input1 $input2
       [1] "10"
       [1] "20"
    

    最终想在固定路径下获取数据,进行输入参数即可得到指定路径下的数据名称。

     [root@tandelin home]#input=“/home/data.csv”
     [root@tandelin home]#Rscript test.R $input
     PArameter=print( Args[1] )
     newdata=read.csv( PArameter )
     [1] "1" "3" "1" "3"
     [2] "1" "3" "1" "3"
     [3] "1" "3" "1" "3"
     [4] "1" "3" "1" "3"
     [5] "1" "3" "1" "3"
     [6] "1" "3" "1" "3"
    

    以上就完成了基本的参数传递,后续细化,即可得到较好的数值/路径引入。

    展开全文
  • 第一章,初学R语言

    2016-04-24 15:06:20
    学习R语言,肯定要清楚它能干嘛,它的作用就是把常见的统计方法封装起来了,直接调用起来就非常简单了。比如means(obeject),这就是一个求均值的方法,直接调用它就行,括号中的元素就是你要求均值的对象。R包含了...
    初学R语言
    学习R语言,肯定要清楚它能干嘛,它的作用就是把常见的统计方法封装起来了,直接调用起来就非常简单了。比如means(obeject),这就是一个求均值的方法,直接调用它就行,括号中的元素就是你要求均值的对象。R中包含了基本上所有的数学上的算法,通过它我们能直接得到我们的答案。
    第一步,导入数据(想要使用R,你必须把数据导入进去)
    read.table(file="%.txt",header=T)
    以上就是读入数据的命令,read.table(),file就是文件的目录加文件名(不过我习惯把工作路径直接设在当前文件目录中),header就是说第一行是不是列标识,T就是TRUE,F就是FALSE。
    a<-read.table(file="lm1.txt",header=F)
    getwd()就是获得工作路径,把lm1.txt文件放在工作目录下,就把文件读入对象a了。
    第二步,导出数据
    write.table(object,file="export.txt")
    把object文件导出在当前工作目录下,并命名为export.txt。
    第三步,R中有哪些数据类型
    向量(vector)
    c(1,2,3)
    因子(factor)
    factor(x)
    矩阵(matrix)
    matrix(x,ncol=2)
    数据框(data.frame)
    data.frame(x)
    列表(list)
    list(x)
    以上这几种数据框架我们做统计经常需要接触,大家一定要熟悉掌握。
    到这里我们就结束了第一章
    展开全文
  • r就是保持字符串原始值的意思,在我们输入路径的时候,总会出现斜杠“\”,这个符号在python语言中具有转义的作用,加上r就是避免转义,直接原文输出。 2.python输出函数加上f的作用:即print(f" ") 主要作用就是...

    1.python输出函数加上r的作用:即print(r" ")

    主要的原因是为防止转义,保证r后面的内容全文输出。

    r就是保持字符串原始值的意思,在我们输入路径的时候,总会出现斜杠“\”,这个符号在python语言中具有转义的作用,加上r就是避免转义,直接原文输出。

    2.python输出函数加上f的作用:即print(f" ")

    主要作用就是格式化字符串,加上f以后,{"变量/表达式"},花括号里的变量和表达式就可以使用了。

    举个例子,体会一下:

    for i in range(9):

                 print(f"本次循环输出值的平方为:{i*i}")

    希望对看到的人有帮助,

    ###因为相信,所以美好###

    我们都不孤单,一起努力*_*

    加油@_@,

     

    展开全文
  • R语言中,常需要看哪个包加载了或是看多个相似功能包,看到底是哪个包在起作用,通过加载和卸除后进行运行比较分析。 1、查看已加载包 &gt;(.packages()) 注意外面的括号和前面点不能省。 2、卸除已加载...
  • R语言中,常需要看哪个包加载了或是看多个相似功能包,看到底是哪个包在起作用,通过加载和卸除后进行运行比较分析。 1、查看已加载包 >(.packages()) 注意外面的括号和前面点不能省。 2、卸除已加载包 如...
  • 在面向对象的语言中,类功能更强大,这是因为类不仅 含有定义数据类型功能,而且还包含了对方法定义。 对象实际是类中一个实例。生成实例过程叫做把"一个对象实例化"。一个实例化 对象实际上是由若干个...
  • 14 取模运算符(modulusoperator)“%”的作用是什么? 第2章 变量和数据存储 2. 1 变量存储在内存(memory)的什么地方? 2. 2 变量必须初始化吗? 2. 3 什么是页抖动(pagethrashing)? 2. 4 什么是const...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢?  3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')代码...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')代码……...
  • Python核心编程第二版(中文)

    热门讨论 2015-04-23 16:40:13
    1.7 比较Python(Python与其他语言的比较) 1.8 其他实现 1.9 练习 第2章 快速入门 2.1 程序输出,print语句及“Hello World!” 2.2 程序输入和raw_input()内建函数 2.3 注释 2.4 操作符 2.5 变量和赋值...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35  3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\...
  • 赋值”运算符\r\n2.6 Object Pascal类型\r\n2.6.1 类型比较\r\n2.6.2 字符类型\r\n2.6.3 字符串\r\n2.6.4 变体类型\r\n2.6.5 货币类型\r\n2.7 用户自定义类型\r\n2.7.1 数组\r\n2.7.2 动态数组\r\n2.7.3 记录\r\n...
  • 赋值”运算符\r\n2.6 Object Pascal类型\r\n2.6.1 类型比较\r\n2.6.2 字符类型\r\n2.6.3 字符串\r\n2.6.4 变体类型\r\n2.6.5 货币类型\r\n2.7 用户自定义类型\r\n2.7.1 数组\r\n2.7.2 动态数组\r\n2.7.3 记录\r\n...
  • Python核心编程(中文第二版)

    热门讨论 2009-10-02 12:08:14
     1.7 比较Python(Python与其他语言的比较)   1.8 其他实现   1.9 练习   第2章 快速入门   2.1 程序输出,print语句及“Hello World!”   2.2 程序输入和raw_input()内建函数   2.3 注释  ...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35  3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 64 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 64 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')...
  •  3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')代码...
  • LINGO软件学习

    2009-08-08 22:36:50
    LINGO内置建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO求解器求解。因此,集属性值一旦在模型被确定,就不可能再更改。在LINGO,只有在初始部分给出集属性值在以后...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')...
  • 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

r语言中括号的作用