如何在函数内获取递归应用的当前函数?这是一个简单的例子:
myfun <- function(x) {
if(is.list(x)){
lapply(x, myfun)
} else {
length(x)
}
}
Run Code Online (Sandbox Code Playgroud)
我想把它变成匿名,但是我不知道lapply在没有名字时如何告诉使用当前函数.我尝试Recall但是这不起作用:
(function(x) {
if(is.list(x)){
lapply(x, Recall)
} else {
length(x)
}
})(cars)
Run Code Online (Sandbox Code Playgroud)
也match.call()[[1]]没有帮助匿名函数.
我经常遇到需要检查某个条件是否适用于非常大的向量或列表的任何或所有元素的情况.例如,检查列表是否包含NULL我将使用的任何/仅元素:
any(vapply(x, is.null, logical(1))
all(vapply(x, is.null, logical(1))
Run Code Online (Sandbox Code Playgroud)
然而,这是低效的,因为它总是检查列表中的每个元素.更聪明的实现将停止检查何时找到第一个NULL或非NULL元素.即相当于:
is.null(x[[1]]) || is.null(x[[2]]) || is.null(x[[3]]) || ...
is.null(x[[1]]) && is.null(x[[2]]) && is.null(x[[3]]) && ...
Run Code Online (Sandbox Code Playgroud)
用for循环执行此操作很慢.r-base提供了一些特殊情况,例如,这anyNA是一个有效的版本any(is.na(.)).但是我想知道我们是否可以更普遍地实现它并提供用于检查条件的优化函数:
all_fast(x, is.null)
any_fast(x, is.null)
Run Code Online (Sandbox Code Playgroud)
但是也:
all_fast(x, function(z) {length(z) == 2})
all_fast(x, is, "POSIXt")
Run Code Online (Sandbox Code Playgroud) 有没有办法在加载data包(但尚未附加)时从内存中的包自动加载对象?即延迟装载的反面?该对象用于其中一个包函数,因此需要始终可用.
当程序包设置lazydata=false为时,程序包根本不会导出数据对象,需要手动加载data().我们可以使用类似的东西:
.onLoad <- function(lib, pkg){
data(mydata, package = pkg)
}
Run Code Online (Sandbox Code Playgroud)
但是,data()在全局环境中加载对象.我更喜欢在包环境中加载它(这是lazydata所做的)以防止屏蔽冲突.
解决方法是data完全绕过机制,并简单地对包中的对象进行硬编码.因此包装myscore.R看起来像
mymodel <- readRDS("inst/mymodel.rds")
myscore <- function(newdata){
predict(mymodel, newdata)
}
Run Code Online (Sandbox Code Playgroud)
但这将导致大型数据对象的巨大packagedb,我不确定这会带来什么后果.
OpenCPUContent-Type: application/octet-stream当前在提供序列化 R 对象(即从serialize或保存的数据)时使用saveRDS。例如:
curl -v https://public.opencpu.org/ocpu/library/MASS/data/cats/rds 2>&1 \
| grep Content-Type
< Content-Type: application/octet-stream
< Access-Control-Allow-Headers: Origin, Content-Type, Accept, Cache-Control
< Access-Control-Expose-Headers: Location, X-ocpu-session, Content-Type, Cache-Control
Run Code Online (Sandbox Code Playgroud)
然而,对于客户端和其他 OpenCPU 服务器来说,在交换数据时使用指定的 MIME 类型区分任意 blob 和 rds 对象会很好。
问题:什么适合Content-Type序列化的 R 对象?例如:
application/r-rdsapplication/r-serialized-object请注意,RFC8848现在建议不要使用X-前缀,并指出:
在应用程序协议上下文中使用的新参数的创建者:
- 应该假设他们创建的所有参数可能会变得标准化、公开、普遍部署或可在多个实现中使用。
不幸的是,苹果没有libicucore在 OSX 上包含头文件。有什么办法可以使用这个库吗?我只需要一些简单的功能,而 ICU 太大而无法与我的应用程序捆绑在一起。它看起来像最近的 ICU 版本 53.1.0:
jeroen$ otool -L /usr/lib/libicucore.dylib
libicucore.dylib:
/usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 53.1.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
Run Code Online (Sandbox Code Playgroud)
使事情复杂化的是,我很难找出ICU的核心目标中包含的内容。我可以使用nm手动检查库中是否存在特定符号:
jeroen$ nm /usr/lib/libicucore.dylib | grep ToUpper
00000000000b74c9 T _u_strToUpper
000000000006ff70 T _ucasemap_utf8ToUpper
Run Code Online (Sandbox Code Playgroud)
现在我可以手动u_strToUpper从 ICU 的 53.1.0 版本中获取头文件,但这是很多工作。是否有更好的方法在 OSX 上查找或生成 ICU 核心 53.1.0 的标头?
我使用httr将简单文件上传到Google云端硬盘.问题是每个文档都被上传为"无标题",我必须修补元数据以设置标题.PATCH请求偶尔会失败.
根据API,我应该能够进行分段上传,允许我将标题指定为上传文件的同一POST请求的一部分.
res<-POST(
"https://www.googleapis.com/upload/drive/v2/files?convert=true",
config(token=google_token),
body=list(y=upload_file(file))
)
id<-fromJSON(rawToChar(res$content))$id
if(is.null(id)) stop("Upload failed")
url<-paste(
"https://www.googleapis.com/drive/v2/files/",
id,
sep=""
)
title<-strsplit(basename(file), "\\.")[[1]][1]
Sys.sleep(2)
res<-PATCH(url,
config(token=google_token),
body=paste('{"title": "',title,'"}', sep = ""),
add_headers("Content-Type" = "application/json; charset=UTF-8")
)
stopifnot(res$status_code==200)
cat(id)
Run Code Online (Sandbox Code Playgroud)
我想做的是这样的事情:
res<-POST(
"https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart&convert=true",
config(token=google_token),
body=list(y=upload_file(file),
#add_headers("Content-Disposition" = "text/json"),
json=toJSON(data.frame(title))
),
encode="multipart",
add_headers("Content-Type" = "multipart/related"),
verbose()
)
Run Code Online (Sandbox Code Playgroud)
我得到的输出显示各个部分的内容编码是错误的,它导致400错误:
-> POST /upload/drive/v2/files?uploadType=multipart&convert=true HTTP/1.1
-> User-Agent: curl/7.19.7 Rcurl/1.96.0 httr/0.6.1
-> Host: www.googleapis.com
-> Accept-Encoding: gzip
-> Accept: application/json, text/xml, application/xml, */*
-> Authorization: Bearer ya29.ngGLGA9iiOrEFt0ycMkPw7CZq23e6Dgx3Syjt3SXwJaQuH4B6dkDdFXyIC6roij2se7Fs-Ue_A9lfw
-> Content-Length: 371 …Run Code Online (Sandbox Code Playgroud) 我想运行我的单元测试套件,-fsanitize=address,undefined并将所有 sanitizer 错误写入report.txt文件。默认情况下,所有 sanitizer 错误都会写入 stdout,但是该软件也会将信息写入 stdout,因此这使得检测错误变得困难。我试过:
export ASAN_OPTIONS="log_path=asan.log"
./mytests
Run Code Online (Sandbox Code Playgroud)
我还尝试在运行测试之前调用 C API:
#include <sanitizer/asan_interface.h>
__sanitizer_set_report_path("/tmp/asan.log")
Run Code Online (Sandbox Code Playgroud)
然而,两者似乎都不起作用,所有错误都被写入标准输出。我正在使用 Debian 测试:
root@94e239ad460a:~# gcc --version
gcc (Debian 6.1.1-11) 6.1.1 20160802
Copyright (C) 2016 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
是否有任何替代方法可以将我的单元测试中的消毒剂错误保存在某处?
我正在寻找一种方法来tempdir()在R会话开始后更改位置.我认为需要更新C级全局变量R_TempDir.在R内做这件事的好方法是什么?
我有一个人手机记录的分钟GPS坐标的数据集.即数据集具有1440行具有LON/LAT值.基于数据,我想要参与者回家的点估计(lon/lat值).让我们假设家是他们在给定的24小时间隔内花费大部分时间的单一位置.此外,GPS传感器大多数时间具有相当高的精度,但有时它完全关闭导致巨大的异常值.
我认为解决这个问题的最佳方法是将其视为点过程,并使用2D密度估算来找到峰值.在R中有这种本地方式吗?我查看了kde2d(MASS),但这似乎并没有真正起作用.Kde2d使用密度值创建25x25的数据范围网格.但是,在我的数据中,这个人每天可以轻松地行驶100英里或更多,所以这些街区通常估计太大了.我可以缩小它们并使用更大的网格,但我相信必须有更好的方法来获得点估计.
我正在寻找一个javascript库(或我可以实现的算法),以便在单个页面上放置任意大小的图像,剩下很少的空白.与Google Plus显示图像的方式类似[示例].或者甚至可能更有趣(谷歌使它们相同的高度)
可以稍微调整图像的缩放比例,只要纵横比没有搞砸,并且看起来很适合页面上的"适合".
r ×7
cran ×3
c ×2
clang ×1
content-type ×1
file-upload ×1
gcc ×1
geospatial ×1
html ×1
http ×1
httr ×1
icu ×1
image ×1
javascript ×1
jquery ×1
macos ×1
multipart ×1
performance ×1
photoshop ×1
sanitizer ×1
spatial ×1
ubsan ×1