这是非常基本的,但我似乎无法弄明白
假设我有一个变量条目列表:
lst <- list(a=1:4, b=rep('k', 5), c=3)
Run Code Online (Sandbox Code Playgroud)
如果我想用指定的名称添加一个向量,我应该能够通过以下方式这样做:
c(f=1:5, lst)
Run Code Online (Sandbox Code Playgroud)
但是不是创建一个名为'f'的条目,包含1 2 3 4 5,而是创建五个条目(f1-f5),每个条目包含一个数字.
我该如何抑制这种行为?
我知道我可以使用
lst$f <- 1:5
Run Code Online (Sandbox Code Playgroud)
但我想在函数调用中附加列表...
给定一个a包含不等长度向量的列表和一个b包含来自向量的元素的向量的列表a,我想得到一个等长的向量来b包含匹配a元素的索引b(这是我所知道的一个不好的解释)...
以下代码完成了这项工作:
a <- list(1:3, 4:5, 6:9)
b <- c(2, 3, 5, 8)
sapply(b, function(x, list) which(unlist(lapply(list, function(y, z) z %in% y, z=x))), list=a)
[1] 1 1 2 3
Run Code Online (Sandbox Code Playgroud)
sapply当然,用for循环替换也可以实现相同的目的
问题是这个代码将用于长度大于1000的列表和向量.在现实生活中,该函数大约需要15秒(for循环和for sapply).
有没有人知道如何加快速度,对并行方法安全?我没有看到矢量化方法(我不能用C编程,尽管这可能是最快的).
编辑:
只会强调Aaron使用match()的优雅解决方案,其速度提升1667次(从15到0.009)
我在它上面扩展了一下以允许多个匹配(返回是一个列表)
a <- list(1:3, 3:5, 3:7)
b <- c(3, 5)
g <- rep(seq_along(a), sapply(a, length))
sapply(b, function(x) g[which(unlist(a) %in% x)])
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3
Run Code Online (Sandbox Code Playgroud)
这个的运行时间是0.169,这可能相当慢,但另一方面更灵活
考虑一个矩阵,每行指定一个二维区域,另一个矩阵指定平面中的点:
xmin <- c(3, 14, 25, 61)
xmax <- c(5, 18, 27, 65)
ymin <- c(33, 12, 83, 2)
ymax <- c(35, 16, 90, 6)
regions <- cbind(xmin, xmax, ymin, ymax)
x <- c(7, 26, 4, 16)
y <- c(4, 85, 30, 13)
points <- cbind(x, y)
Run Code Online (Sandbox Code Playgroud)
获取索引的最快方法是什么regions,其中包含每个点points?
我想要实现的一个例子是:
apply(points, 1, function(x){
which(regions[,'xmin'] < x[1] & regions[,'xmax'] > x[1] & regions[,'ymin'] < x[2] & regions[,'ymax'] > x[2])
})
Run Code Online (Sandbox Code Playgroud)
但是随着两者中的行数regions和points接近1E5 的行数变得相当慢,我正在寻找一种适当的矢量化方法......
提前致谢...
最佳托马斯 …
我正在编写一个S4类,其中内部数据存储在数据库中,该类主要是用于访问和修改数据库中信息的守门员.这个类必须的方法,如getInfoA与getInfoA<-用于提取和设置的某些信息.
我的问题涉及以下案例:
myObject <- new('myClass', db='path/to/database')
getInfoA(myObject)[1:5] <- letters[1:5]
Run Code Online (Sandbox Code Playgroud)
这里的setter在赋值之前是子集的.通常,当数据存储在标准R结构中时,这会自动解决,但是当数据存储在别处时如何正常处理?[<-R中有一个原语,但我不清楚调度是如何进行的,以及在何处以及如何拦截它......
我正在尝试在 R 中设置一个异步 system() 调用。为了使它有用,用户需要一种方法来检查进程是否已经结束。问题是如何测试?在如何运行可执行文件,然后在 Windows 中使用 R 杀死或终止相同的进程时,建议似乎是在 system() 调用之前和之后捕获所有 pid 以获取刚刚启动的进程的 pid (然后可以用来测试它是否已经结束),但这似乎是一种容易出错的方法,而且它依赖于操作系统......
是否有其他方法可以解决此问题(不必涉及 pid)
编辑:这应该用于当前场景:
我正在开发一个 Shiny GUI,它可以处理在 Java 中实现的可能很长时间运行的计算。计算是分批完成的,在这些运行期间,即使 R 空闲,GUI 也被锁定,无法与 R 服务器交互,因为它正在等待 Java 进程完成。我想要一种方法来启动 Java 进程而不是等待它完成(使用 wait=FALSE 参数),而是有一种检查它是否已完成的故障安全方法,因此可以相应地更新 GUI...
给定一个列表(a)和一个长度与a相同的数字向量(b):
a <- list(1, c(3, 7), 5)
b <- c(1,1,2)
Run Code Online (Sandbox Code Playgroud)
如何创建一个长度为max(b)的新列表,其中a中的每个元素都根据b放入相应的索引中,如果出现多次,则组合起来,这样就得到:
[[1]]
[1] 1 3 7
[[2]]
[1] 5
Run Code Online (Sandbox Code Playgroud)
希望这可以非常有效地完成(没有循环),因为我的数据的维度往往非常大......
我很确定有一个明显的解决方案我没想过......
谢谢您的帮助
我有一个长期运行的进程(用Java编写),我希望与系统异步运行(...,wait = FALSE).为了能够确定进程何时结束,我想根据在如何确定何时以系统启动进程(...,wait = FALSE)中给出的建议结束后创建文件.问题是,似乎wait参数仅适用于多行系统命令中的最后一行,而我似乎无法找到解决方法.
例:
system('sleep 2') # waits 2 seconds before control is returned to the user
system('sleep 2', wait=FALSE) # control is returned immediately
system('sleep 2; ls', wait=FALSE) # waits 2 seconds before control is returned to the user
Run Code Online (Sandbox Code Playgroud)
我正在运行mac系统btw ...
我正在开发一个包,我希望在其中向对象添加编辑历史记录。该包允许其他包注册用于编辑对象的函数。我正在寻找一种方法来记录注册用于编辑的函数的包的版本。
问题是:给定一个函数,如何从导出的位置获取包?我的想法是研究它的搜索路径,但search()只报告当前环境的搜索路径,因此不报告我需要的函数的搜索路径。
非常感谢任何指向其他方法的指示。
获取包的上下文是这样的:
registerFunction <- function(fun) {
package <- getPackage(fun) ## This is what I need
version <- getPackageVersion(package)
register(fun, package, version)
}
Run Code Online (Sandbox Code Playgroud)