我是R的新手,我想了解下面给出的选项1和选项2之间的区别:
ArrayList<String> arrayList = new ArrayList<>();
选项1:
x <- 10
选项2:
get <- x
当我get <- function() x
基于选项1时,我的结果为print(get)
,当我10
基于选项2时,我的结果又是print(get())
。但我不明白这两项任务是如何相互不同的。
答案 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