在R,我注意到的解析树function
运营商似乎是在这个意义上,它的第四个要素是看似总是由前三个元素的冗余.
例如,
> as.list(substitute(function(x = 1){x^2}))
[[1]]
`function`
[[2]]
[[2]]$x
[1] 1
[[3]]
{
x^2
}
[[4]]
function(x = 1){x^2}
Run Code Online (Sandbox Code Playgroud)
我注意到的一件事是第四个元素确实存储了输入函数的格式.
> as.list(substitute(function(x = 1){
+ x^2})[[4]]
function(x = 1){
x^2}
Run Code Online (Sandbox Code Playgroud)
解析树中第四个元素的目的是什么?我唯一能看到它被使用的是你想要逐字打印一个函数,你已经可以通过打印函数来完成,例如
> f = function(x = 1){
+ x^2}
> f
function(x = 1){
x^2}
Run Code Online (Sandbox Code Playgroud) 我觉得这是一个相当基本的问题,但我无法弄清楚.
如果我在R中定义一个函数,我以后如何使用该函数的名称来获取其解析树.我不能只使用substitute
,因为它将返回其参数的解析树,在这种情况下只是函数名称.
例如,
> f <- function(x){ x^2 }
> substitute(f)
f
Run Code Online (Sandbox Code Playgroud)
我应该如何使用其名称访问函数的解析树?例如,如何在substitute(function(x){ x^2 })
不明确写出整个函数的情况下获取值?
在R中,有没有办法制作一个switch语句,以便为两种不同的情况执行相同的代码块?显然我可以复制并粘贴两个语句的整个代码,但我希望有一个更简洁的方法来做到这一点.
我也可以使用if-else块来避免重复大块代码,但是在R中切换通常更快.
由于R将switch语句解析为函数的方式似乎不太可能,但我希望R的开发人员特别注意解析switch语句以允许多个参数引用相同的代码块.
在LISP中,我有一个传递列表的函数.我想在不更改原始列表的情况下更改此列表的元素.通常,我会copy-list
用来创建我将更改的列表的本地副本,但这似乎不起作用:
CL-USER> (defun test (item)
(let ((copy (copy-list item)))
(setf (nth 0 (nth 0 (nth 0 copy))) t)
(print item)
(print copy)))
CL-USER> (defparameter item `(((NIL NIL) (NIL NIL) (NIL NIL))
((NIL NIL NIL) (NIL NIL NIL))
((3 3) (NIL NIL))))
CL-USER> (test item)
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
(((T NIL) …
Run Code Online (Sandbox Code Playgroud) 我在Spark中有一个带有2列的数据框,group_id
并且value
,其中value
是double.我想根据group_id
每个组的顺序对数据进行分组value
,然后添加第三列index
,表示value
组中值的排序位置.
例如,考虑以下输入数据:
+--------+-----+
|group_id|value|
+--------+-----+
|1 |1.3 |
|2 |0.8 |
|1 |3.4 |
|1 |-1.7 |
|2 |2.3 |
|2 |5.9 |
|1 |2.7 |
|1 |0.0 |
+--------+-----+
Run Code Online (Sandbox Code Playgroud)
那么输出就像是
+--------+-----+-----+
|group_id|value|index|
+--------+-----+-----+
|1 |-1.7 |1 |
|1 |0.0 |2 |
|1 |1.3 |3 |
|1 |2.7 |4 |
|1 |3.4 |5 |
|2 |0.8 |1 |
|2 |2.3 |2 |
|2 |5.9 |3 | …
Run Code Online (Sandbox Code Playgroud) 有没有办法从评估公式中检索函数调用中未指定的函数参数?
例如,考虑呼叫seq(1, 10)
.如果我想获得第一个参数,我可以使用quote()
并简单地使用quote(seq(1,10))[[1]]
.但是,这仅在函数调用中定义参数(而不是具有默认值)时才有效,并且我需要知道其确切位置.
在这个例子中,是否有一些方法可以by
从seq(1, 10)
没有冗长的if
语句列表中获取参数来查看它是否已定义?
在R中,回归函数glm
产生一个类的对象,glm
它是一个列表.
由于它是一个列表,我应该能够将类的对象glm
视为列表而不进行任何格式化.但是,as.list
似乎没有这样做.
例如,if fit
是由函数拟合的模型glm
:
> as.list(fit)
Call: glm(formula = V4 ~ V3 + V2 + V1, family = Gamma, data = data)
Coefficients:
(Intercept) V3 V2 V1
1.349 1.593 1.577 1.127
Degrees of Freedom: 9999 Total (i.e. Null); 9996 Residual
Null Deviance: 2137
Residual Deviance: 2048 AIC: -30180
Run Code Online (Sandbox Code Playgroud)
另一方面,适用于列表的其他函数正确工作,例如names
将生成相关列表的30个名称.
此外,我可以以与我对任何其他列表相同的方式查看单个元素:
> fit$coefficients
(Intercept) V3 V2 V1
1.349282 1.593067 1.576868 1.127067
Run Code Online (Sandbox Code Playgroud)
是否有任何预先存在的功能,允许我fit
在列表中查看而不进行格式化?
正如我上面所说,我可以使用列表的名称构建自己的函数,但这对于这样一个简单的任务来说似乎是不必要的.
在阅读MINIX的源代码时,我遇到了以下内容:
int do_read_write(rw_flag)
int rw_flag; /* READING or WRITING */
{
Run Code Online (Sandbox Code Playgroud)
看起来中间行用于声明rw_flag
函数输入的类型,但我以前从未见过这种表示法.它与以下有何不同?
int do_read_write(int rw_flag) {
Run Code Online (Sandbox Code Playgroud)
如果没有,它是否可以用于任何目的,除了扩展代码以便可以更多地评论它?
在R,有将返回一个函数TRUE
,如果它的参数的类型为language
和FALSE
以其他方式?
该is.language
函数不满足此要求,因为它将返回TRUE
类型symbol
或类型的参数expression
.显然,我可以简单地检查参数的类型是language
使用类似的东西typeof(x) == 'language'
还是编写我自己的函数,但似乎奇怪的是R不会为此目的而拥有自己的函数,因为R中的大多数类型具有相关的 -特定于这些类型的类型函数.
使用Visual Studio 2012时,以下代码编译时没有错误(T是模板参数):
pair<map<T, int>::iterator, bool> ret;
Run Code Online (Sandbox Code Playgroud)
但是,当我使用g ++时,它会抛出错误消息
error: type/value mismatch at argument 1 in template parameter list for template<class _T1, class _T2> struct std::pair
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它不承认map<T, int>::iterator
是一种类型.我应该如何解决这个问题?
r ×6
parse-tree ×2
apache-spark ×1
c ×1
c++ ×1
common-lisp ×1
g++ ×1
glm ×1
lisp ×1
parsing ×1
substitution ×1