我经常运行占用大量 RAM 的代码,并且可能需要长达一个小时才能提供输出。通常,我会花半个小时来运行这样的代码,而且我会担心会出现问题。有什么办法可以让 R 向我保证还没有任何错误?我想我可以将里程碑放在代码本身中,但我想知道 R(或 RStudio)中是否有任何东西可以在运行时自动完成这项工作。例如,查看代码使用了多少内存会很方便,因为只要我看到内存使用量显着变化,我就会放心它仍在工作。
我记得在Clojure for Lisp Programmers 视频中重复的一个说法是,早期 Lisp,尤其是 Common Lisp 的一个很大的弱点是太多地与 Lisp 的列表结构相结合,尤其是cons单元格。您可以在链接视频的 25 分钟标记处找到此声明的一次出现,但我确信我记得在该系列的其他地方听到过它。重要的是,在视频的同一点,我们看到了这张幻灯片,向我们展示了 Clojure 有许多其他数据结构,而不仅仅是老派的 Lispy 列表:
这让我很困扰。我对 Lisp 的了解非常有限,但我一直被告知,其传奇的元可编程性的一个关键要素是一切 - 是的,一切 - 都是一个列表,这是防止我们在尝试时遇到的那种错误的原因元程序其他语言。这是否意味着通过添加新的一流数据结构,Clojure 降低了其同象性,从而使其比其他 Lisp(例如 Common Lisp)更难元编程?
在大多数带有switch语句的语言中,它switch是一种特殊的形式,旨在延迟评估可能性,并且编译器知道如何根据给定的输入优化语句的选择。R,大多已经很懒了,不需要其中的一些。然而,R 的switch语句仍然是一个函数调用,而不是任何一种特殊的形式。这是否意味着 R 的switch语句比它是一种特殊形式时要慢?或者 R 的解释器是否知道优化它,好像它是一种特殊形式?
我最近写了这行代码:for(i in seq_len(exponent)){out<-squareMat%*%out}. 显然,i从来没有用过,我只是想说“exponent次,做out<-squareMat%*%out”。没有多余的计数器,有没有办法做到这一点i?例如,是否有一个apply家庭功能?
示例 - 我有:
squareMat<-matrix(c(0,10,20,30),2,2)
out<-diag(nrow = nrow(squareMat))
exponent<-5
for(i in seq_len(exponent)){out<-squareMat%*%out}
out
Run Code Online (Sandbox Code Playgroud)
我想要的是:
squareMat<-matrix(c(0,10,20,30),2,2)
out<-diag(nrow = nrow(squareMat))
exponent<-5
[do exponent times]{out<-squareMat%*%out}
out
Run Code Online (Sandbox Code Playgroud) 考虑:
x <- 5
replicate(10, x <- x + 1)
Run Code Online (Sandbox Code Playgroud)
这有输出c(6, 6, 6, 6, 6, 6, 6, 6, 6, 6)。然而:
x <- 5
replicate(10, x <<- x + 1)
Run Code Online (Sandbox Code Playgroud)
有输出c(6, 7, 8, 9, 10, 11, 12, 13, 14, 15)。
这对x <- x + 1被评估的环境意味着什么?我是否相信它x被视为内部变量replicate?这似乎是我所看到的,但是当我查阅语言定义的相关部分时,我看到了以下内容:
还值得注意的是,如果参数被求值,foo(x <- y) 的效果是在调用环境中而不是在 foo 的求值环境中更改 x 的值。
但如果x真的是在调用环境中改变了,那为什么会:
x <- 5
replicate(10, x <- x + 1)
x
Run Code Online (Sandbox Code Playgroud)
返回5与否 …
Peter Norvig 曾说过,许多 OOP 设计模式在 Lisp 中都是微不足道或多余的。这里的幻灯片 #10声称一流类型取代了其中的许多类型。
在什么意义上,Common Lisp 中的类型是一流的?作为参考,《计算机程序的结构和解释》给出了以下编程语言元素必须满足的条件才能被视为一流:
它们可以通过变量命名。
它们可以作为参数传递给过程。
它们可以作为程序的结果返回。
它们可能包含在数据结构中
证明 Common Lisp 中的类型满足上述条件将是一个很好的答案。
我想写以下内容
CASE [FOO]
WHEN 1 THEN 'YES'
WHEN 0 THEN 'NO'
WHEN NULL THEN 'NO'
END
Run Code Online (Sandbox Code Playgroud)
我当然可以写
CASE
WHEN [FOO] = 1 THEN 'YES'
WHEN [FOO] = 0 OR FOO IS NULL THEN 'NO'
END
Run Code Online (Sandbox Code Playgroud)
反而。
除了风格之外,是否有任何理由(例如性能)更喜欢其中一种?
在一本关于 SQL Server 2014 的书中,建议我避免
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE YEAR(orderdate) = 2014;
Run Code Online (Sandbox Code Playgroud)
并且更喜欢
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20140101'
AND orderdate < '20150101';
Run Code Online (Sandbox Code Playgroud)
当存在聚集索引时,orderdate因为使用YEAR会使查询不可SARGable。
自 SQL Server 2014 以来,这种情况有变化吗?如果是这样,它是在哪个版本中更改的?
r ×4
apply ×2
c# ×2
common-lisp ×2
sql ×2
sql-server ×2
t-sql ×2
case ×1
clojure ×1
control-flow ×1
date ×1
field ×1
first-class ×1
for-loop ×1
interface ×1
lisp ×1
memory ×1
optimization ×1
out ×1
performance ×1
replicate ×1
scope ×1
static ×1
types ×1
valuetuple ×1
verbosity ×1