R用简单的术语 - 为什么我要感觉像这样的白痴?

时间:2015-06-11 12:13:52

标签: r

我的问题很简单...我在书本和互联网上找到的用于学习R编程的每个参考都以非常线性的方式呈现,没有上下文。当我尝试学习像函数这样的东西时,我看到代码和我的大脑只是冻结,因为它正在寻找与这些R术语相关的东西,而我没有参考框架。我有一个博士学位,并为我的论文做了很多统计,但那是几年前我们使用不同的编程语言时,当涉及到R时,我不知道为什么我不能把它变成我的头。是否有人能用简单的英语解释这个简单代码的例子?例如:

above <- function(x, n){    
      use <- x > n    
      x[use]    
}

x <- 1:20
above(x, 12)
## [1] 13 14 15 16 17 18 19 20

我试图了解此代码中发生了什么,但根本不知道。结果,我永远不能自己编写这段代码,因为我不会在脑海里用这种语言来解释这个问题。我被困在第一行:

  

上面&lt; - function(x,n){

有人可以用简单的英语解释这个代码示例,所以我有一些上下文可以理解我在看什么以及我为什么要做我在这段代码中做的事情?我的意思是简单的英语是,一步一步地走过代码而不仅仅是重复R中的官方术语,比如矢量,函数和数组以及所有其他的东西,但是以常识的方式告诉我这是什么装置

3 个答案:

答案 0 :(得分:4)

由于你的背景(统计学博士)是理解这一点的最佳方式 用数学的话说。

从数学上讲,您正在定义一个名为above的参数函数,该函数从某个值x之上的向量n中提取所有元素。 您只是过滤了集合或向量x。  在设置表示法中,您可以编写如下内容:

  

上面:{x,n} - &gt; {y in x; Y'将N}

现在,仔细阅读代码并解释它(在左边的数学方面,右边是R中的等价物):

 Math                     R
----------------       ---------------------
above: (x,n)     <--->  above <- function(x, n)
{y in x ; y>n}   <--->  x[x > n]

因此,要在函数中包含所有语句,您应该遵循语法:

function_name <- function(arg1,arg2) { statements} 

将上述内容应用于此示例(我们在此处有一个语句):

above <- function(x,n) { x[x>n]}

最后调用此函数与调用数学函数完全相同

 above(x,2)

答案 1 :(得分:3)

好的我会尝试,如果这个太详细让我知道,但我试着走得很慢:

above <- function(x, n)

这定义了一个函数,它只是一些在给定输入的情况下产生一些输出的过程,<-意味着将右侧的内容分配给左侧的内容,或换句话说放置右边的所有内容都放在左边的对象中,所以例如container <- 1将1放入容器中,在这种情况下我们将一个函数放在上面的对象中,

function(x, n) paranthesis中的所有内容都指定了函数所需的输入,因此这个函数需要两个变量x和n,

现在我们来到函数的主体,定义它对输入x和n的作用,函数的主体是curley大括号内的所有内容:

{    
      use <- x > n    
      x[use]    
}

所以让我们一块一块地解释:

use <- x > n

这一部分再次将右侧的内容放入左侧的对象中,右侧发生了什么?如果x大于n,则返回TRUE;如果x等于或小于n,则返回FALSE,因此如果x为5且n为3,则结果为TRUE,并且此值将存储在use中,因此使用包含TRUE现在,如果我们在x内部有多个值,那么x中的每个值都将与n进行比较,例如x = [1, 2, 3]n = 2 比我们有

 1 > 2 FALSE
 2 > 2 FALSE
 3 > 2 TRUE

,因此use将包含FALSE, FALSE, TRUE

x[use]

现在我们正在使用x的一部分,方括号指定我们想要的x部分,所以在我的示例中,x有3个元素,如果我们将它们组合起来,则使用3个元素:

x use
1 FALSE
2 FALSE
3 TRUE

所以现在我们说我不想1,2,但我想要3,结果是3

所以现在我们已经定义了函数,现在我们称之为函数,或者通常我们使用它:

x <- 1:20
above(x, 12)

首先我们将数字1到20分配给x,然后我们告诉上面的函数执行(使用输入x = 1:20和n = 12来完成其curley括号内的所有内容,所以换句话说我们执行以下内容:

above(x, 12)

使用输入x = 1:20和n = 12

执行上述功能
use <- 1:20 > 12

将12与1:20中的每个数字进行比较,如果数字实际上大于12则返回每个比较TRUE,否则返回FALSE,而不是将所有结果存储在use

x[use] 

现在给我x的相应元素,其中向量使用包含TRUE 这样:

x use
1 FALSE
2 FALSE
3 FALSE
4 FALSE
5 FALSE
6 FALSE
7 FALSE
8 FALSE
9 FALSE
10 FALSE
11 FALSE
12 FALSE
13 TRUE
14 TRUE
15 TRUE
16 TRUE
17 TRUE
18 TRUE
19 TRUE
20 TRUE

因此我们将13:20的数字作为结果返回

答案 2 :(得分:0)

我也会给它一个裂缝。一些基本要点可以帮助您朝着正确的方向前进。

1)一个功能的想法。基本上,函数是可重用的代码。我知道在我的分析中出于某些奇怪的原因,我经常想要添加两个数字,将它们乘以三分之一,并将它们除以第四个。 (只是在这里暂停怀疑。)所以我能做到的一种方法就是一遍又一遍地写下操作,如下所示:

(75 + 93)*4/18 

(847 + 3)*3.1415/2.7182

(999 + 380302)*-6901834529/2.5

但这很乏味且容易出错。 (如果我忘记括号会发生什么?)或者,我可以定义一个函数,它接受我输入的任何数字并执行操作。在R:

stupidMath <- function(a, b, c, d){
    result <- (a + b)*c/d
}

该代码说&#34;我想存储这一系列命令并将它们附加到名称&#34; stupidMath。&#34;这被称为定义一个函数,当你定义一个函数时,这一系列命令只是存储在内存中 - 它实际上并没有做任何事情,直到你调用&#34;它。 &#34;调用&#34;它只是命令它运行,当你这样做时,你给它&#34;参数&#34; ---第一行括号中的内容是它所期望的参数,即在我的例子中,它需要四个不同的数据,这些数据将被称为&#39; a&#39;,&#39; b& #39;,&#39; c&#39;和&#39; d&#39;。

然后,它会按照你提供的任何东西做它应该做的事情。 &#34;它应该做的事情&#34;大括号{}中的东西是&#34;&#34; body&#34;该函数,描述了如何处理你给它的参数。所以现在,无论何时你想进行数学运算,你都可以直接打电话给#34;功能。例如,要进行第一次计算,您只需编写stupidMath(75, 93, 4, 18)然后执行该函数,将75视为&#39; a&#39;将83视为&#39; b&#39;,等等。

在您的示例中,该函数名为&#34;以上&#34;它需要两个参数,表示为&#39; x&#39;和&#39; n&#39;。

2)&#34;赋值运算符&#34;:R在主要编程语言中使用<-是唯一的 - 在大多数其他语言中等同于=,即,它说&#34;左边的名字右边是值。&#34;从概念上讲,它就像代数中的变量一样有效。

3)所以&#34;身体&#34;函数(大括号中的东西)首先指定名称&#34;使用&#34;表达式x > n。那里发生了什么。好吧,表达式是计算机评估以获取数据的东西。所以请记住,当你调用函数时,你给它x和n的值。该函数的第一件事是确定x是大于n还是小于n。如果它大于n,则将表达式x > n评估为TRUE。否则,FALSE

因此,如果您要在示例中定义函数,然后使用above(10, 5)调用它,那么正文的第一行将设置局部变量(现在不要担心什么是& #39;本地&#39;变量是)&#39;使用&#39;是真的&#39;。这是一个布尔值。

然后该函数的下一行是&#34;过滤器。&#34;过滤是R中的一个长话题,但基本上,R的东西都是&#34;向量,&#34;也就是说,连续一堆数据。 R中的向量可以像线性代数中的向量,即(1, 2, 3, 4, 5, 99)是向量,但它也可以是除数字之外的东西。现在,我们只关注数字。

关于R(关于R的许多古怪事物之一)的古怪之处在于它将单个数字(和#34;标量&#34;在线性代数术语中)视为仅包含一个项目的向量。

好的,那我为什么要进入那个?因为在R中的许多地方,矢量和标量是可互换的。

因此,在您的示例代码中,当我们调用上面提到的函数时,不是给第一个参数设置标量,而是使用#39;第一个参数的向量。 R喜欢矢量。 R 真的喜欢矢量。 (只是和R人交谈一段时间。他们都痴迷于用向量做每一个goddmamn的事情。)因此,为第一个参数传递一个向量是没有问题的。但这意味着变量&#39;使用&#39;也将是一个矢量。具体来说,&#39;使用&#39;将成为布尔的一个向量,即对于X的每个单独的值为TRUE或FALSE。

采取更简单的版本:假设您说:

mynums <- c(5, 10)
myresult <- above(mynums, 7)

当代码运行时,它要做的第一件事是定义&#39;使用&#39;变量。但x现在是一个向量,而不是一个标量(c(5,10)代码表示&#34;制作一个包含两个元素的向量,并用数字填充它们&#39; 5&#39;和&#39; 10& #39;),所以R将继续进行x的每个元素的比较。由于5小于7且10大于7,因此使用成为布尔值(FALSE, TRUE)的两个项向量

好的,现在我们可以谈谈过滤。因此,布尔值的向量称为“逻辑向量”。并且代码x[use]表示&#34;通过变量使用中的内容过滤x。&#34;当你告诉R按逻辑向量过滤某些东西时,它会向后退出被过滤的东西的元素,这些元素对应于&#39; TRUE&#39;

的值

所以在给出的例子中:

mynums <- c(5, 10)
myresult <- above(mynums, 7)

myresult的价值只是10.为什么?因为功能已过滤&#39; x&#39;通过逻辑向量&#39;使用,&#39; &#39; X&#39;是(5,10),&#39;使用&#39;是的(FALSE,TRUE);因为逻辑的第二个元素是唯一的,所以你只得到x的第二个元素。

并将其分配给变量myresult,因为myresult <- above(mynums, 7)表示&#34;将名称myresult分配给值above(mynums, 7)&#34;

瞧。