R:将函数vs变量赋给变量

时间:2016-06-06 06:32:21

标签: r function variables

我是R的新手,我想了解下面给出的选项1和选项2之间的区别:

ArrayList<String> arrayList = new ArrayList<>();

选项1:

x <- 10

选项2:

get <- x

当我get <- function() x 基于选项1时,我的结果为print(get),当我10基于选项2时,我的结果又是print(get())。但我不明白这两项任务是如何相互不同的。

2 个答案:

答案 0 :(得分:1)

在第一个示例中,您将get变量值x分配给get。在选项2中,为x赋值函数的值为返回值x(无参数,已编辑)。在这种情况下的结果是相同的,因为选项2中函数的唯一功能是返回*apply。通常不使用,但有时在public static class BigBWAMap extends Mapper<Object,Text,IntWritable,Text> File fout; FileOutputStream fos; BufferedWriter bw; String tmpFileString = ""; String[] values1; String[] values2; String tmpDir; //setup method @Override protected void setup(Context context) { Configuration conf = context.getConfiguration(); tmpDir = conf.get("hadoop.tmp.dir","/tmp/"); if(tmpDir == null || tmpDir.isEmpty()) { tmpDir = "/tmp/"; } tmpFileString = tmpDir+"/HadoopTMPFile-"1"-"+213"; // directory where to write: /tmp/HadoopTMPFile-1-213 fout = new File(tmpFileString); try { fos = new FileOutputStream(fout); } catch (FileNotFoundException e) { e.printStackTrace(); } bw = new BufferedWriter(new OutputStreamWriter(fos)); } } 函数中使用“匿名”函数。

答案 1 :(得分:0)

稍微修改一下代码:

x <- 10
get1 <- x
get2 <- (function() x)()
# or equivalently:
# fun <- function() x
# get2 <- fun()

......没有区别,使用完全相同的值。也就是说,identical(get1, get2)等于TRUE。在get2中我们使用了匿名函数,x既未在函数中定义,也未作为参数给出,因此它取自父环境。 get1以更直接的方式获取x的值,但在完成任务后,这不再重要。

另一方面,当然,功能有环境,所以如果你有时间并且不怕浪费精力,你可以做以下事情:

`environment<-`(function() x, new.env())()
# Error in `environment<-`(function() x, new.env())() : 
#  object 'x' not found

# notice that a more conventional way to achieve the above is ...
# foo <- function() x
# environment(foo) <- new.env()
# foo()

未找到x! x去哪了?无处,我们只是没有找到它,因为它不在搜索路径中。

`environment<-`(function() x, new.env(parent=environment()))()
# 10 
# so x was found!
# the anon. function's environment is new.env, with .GlobalEnv as parent
# as x is not found int an empty new.env, it is searched for in .GlobalEnv

那又怎样?这实际上可以产生实际差异。或者至少,这有助于理解环境如何运作。请考虑以下示例:

m1 <- mean(1:5)  
# m1 == 3
m2 <- function() mean(1:5)
m2()
# 3
environment(m2) <- new.env()
m2()
# still 3
environment(m2) <- emptyenv()
m2()
# Error in m2() : could not find function "mean"
m2 <- function() 3+2
m2()
# [1] 5
environment(m2) <- emptyenv()
m2()
# Error in m2() : could not find function "+"

因此,像mean或甚至+这样的名称是必须以某种方式找到其值(函数)的变量。它们通常位于函数环境的父环境中,但我们可以使用environmnent(fun) <- emptyenv()删除它。

到目前为止,重点是什么?有很多,但最重要的一个是避免功能&#34;抓住&#34;是一个好习惯。来自全球环境的一些价值观。也就是说,而不是:

 fun <- function() x
 fun()
 # [1] 10

...对于任何&#34;输入数据&#34;使用参数是一个更好的主意。你想给一个函数:

 fun <- function(x) x
 fun(x)
 # [1] 10
 fun(2) # equivalent to fun(x=2)
 # [1] 2
 fun(x+1)
 # [1] 11