作为一种探索如何在R中为Denver RUG创建包的方法,我决定在datasciencetoolkit API周围编写一个R包装器是一个有趣的小项目.基本的R工具来自RCurl包,如您所想.我被困在一个看似简单的问题上,我希望这个论坛中的某个人能够指出我正确的方向.基本问题是我似乎无法使用postForm()将未键控的字符串作为curl中数据选项的一部分传递,即curl -d"string""address_to_api".
例如,从命令行我可能会这样做
$ curl -d "Tim O'Reilly, Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people"
Run Code Online (Sandbox Code Playgroud)
成功.但是,似乎postForm()在将其他参数传递给POST请求时需要显式键.我查看了datasciencetoolkit代码和开发人员文档以获取可能的密钥,但似乎找不到任何东西.
顺便说一下,通过GET请求将输入传递给DSTK API的其他部分非常简单.例如,
ip2coordinates <- function(ip) {
api <- "http://www.datasciencetoolkit.org/ip2coordinates/"
result <- getURL(paste(api, URLencode(ip), sep=""))
names(result) <- "ip"
return(result)
}
ip2coordinates('67.169.73.113')
Run Code Online (Sandbox Code Playgroud)
将产生预期的结果.
为了清楚起见,我已经阅读了DTL的omegahat网站上的RCurl文档,包含RCurl文档以及curl手册页.但是,我遗漏了一些关于curl(或者postForm()函数中的.opts())的基本内容,我似乎无法得到它.
在python中,我基本上可以使用httplib.HTTPConnection创建一个'原始'POST请求 - 就像在R中可用的那样?我也查看了httpRequest包中的simplePostToHost函数,它似乎只是锁定了我的R会话(它似乎也需要一个键).
FWIW,我在Mac 10.6.7上使用R 2.13.0.
任何帮助深表感谢.如果您对使用数据科学工具包感兴趣,所有代码很快就会在github上提供.
干杯.
我第一次尝试了Rcpp功能inline
,它解决了我的速度问题(感谢Dirk!):
R:将负值替换为零
初始版本看起来像这样:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
for(int i=0; i < n_xa; i++) {
if(xa[i]<0) xa[i] = 0;
}
return xa;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)
但是当被调用时cpp_if(p)
,它会p
用输出覆盖,这不是预期的.所以我认为它是通过引用传递的.
所以我用以下版本修复它:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
Rcpp::NumericVector xr(a);
for(int i=0; i < n_xa; i++) {
if(xr[i]<0) xr[i] = 0;
}
return xr;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)
这似乎有效.但是现在,当我将其重新加载到R中时,原始版本不再覆盖其输入(即,相同的确切代码现在不会覆盖其输入):
> cpp_if_src <- '
+ Rcpp::NumericVector …
Run Code Online (Sandbox Code Playgroud) 聪明之后lapply
,我留下了一个二维矩阵列表.
例如:
set.seed(1)
test <- replicate( 5, matrix(runif(25),ncol=5), simplify=FALSE )
> test
[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.8357088 0.29589546 0.9994045 0.2862853 0.6973738
[2,] 0.2377494 0.14704832 0.0348748 0.7377974 0.6414624
[3,] 0.3539861 0.70399206 0.3383913 0.8340543 0.6439229
[4,] 0.8568854 0.10380669 0.9150638 0.3142708 0.9778534
[5,] 0.8537634 0.03372777 0.6172353 0.4925665 0.4147353
[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.1194048 0.9833502 0.9674695 0.6687715 0.1928159
[2,] 0.5260297 0.3883191 0.5150718 0.4189159 0.8967387
[3,] 0.2250734 0.2292448 0.1630703 0.3233450 0.3081196
[4,] 0.4864118 0.6232975 0.6219023 0.8352553 0.3633005 …
Run Code Online (Sandbox Code Playgroud) 该dplyr
软件包引入了%.%
操作符,将左侧作为右侧函数的参数传递,类似于*NIX管道.该magrittr
软件包是一个更轻量级的软件包,仅用于定义类似管道的操作员.
然而一个人使用%.%
另一个人%>%
.
这两者有什么区别吗?我%>%
可以在dplyr
代码中使用甚至是否会导致细微的错误?
在检查代码时,它们在早期就采用了截然不同的路径,因此简单的眼球比较表明它们是不同的.当我在网上搜索它时,我无法找到任何记录,也没有在文档本身中遇到任何问题.
当我有一个超过6个值的变量时,我的麻烦就开始了,因为这是ggplot2中scale_shape函数的当前最大值.
由于这个问题,我尝试了另一个变量,我只是围绕原始变量的长度.
这是我的示例代码:
dataf <- structure(list(Municipality = structure(c(2L, 4L, 10L, 11L, 6L, 8L, 3L, 1L, 5L, 9L, 7L), .Label = c("Boyuibe", "Cabezas", "Camiri", "Charagua", "Cuevo", "Gutierrez", "Huacaya", "Lagunillas", "Machareti", "Vallegrande", "Villa Vaca Guzman"), class = "factor"), Growth = c(3.05, 2.85, 0.14, 1.21, 1.59, 2.35, -0.41, 0.81, 0.9, 2.89, 1.8), Density = c(3.0390920594, 0.260984024187, 5.20069847261, 2.50828556783, 3.43964629267, 3.69768961375, 32.4496626479, 2.06145019368, 4.2139578988, 0.740736713557, 1.67034079825)), .Names = c("Municipality", "Growth", "Density"), class = "data.frame", row.names = c(NA, -11L))
dataf <- dataf[with(dataf, order(Municipality)), ]
# …
Run Code Online (Sandbox Code Playgroud) 为了使我的代码更具可读性,我想避免在创建新对象时已经存在的对象的名称.由于R的基于包的特性,并且因为函数是第一类对象,所以可以很容易地覆盖不在基R中的常见函数(因为常见的包可能使用短函数名但不知道哪个包是加载没有办法检查它).诸如内置逻辑T和F之类的对象也会引起麻烦.
想到的一些例子是:
一个字母
两个字母
一个更好的解决方案可能是避免使用简短的名称来支持更具描述性的名称,我通常会尝试将其作为习惯问题.然而,操作通用data.frame的函数的"df"是充分描述性的,而较长的名称几乎没有增加,因此短名称有其用途.此外,对于不一定知道较大背景的SO问题,提出描述性名称几乎是不可能的.
还有哪些单字母和双字母变量名称与现有R对象冲突? 其中哪些是足够常见的,应该避免它们?如果他们不在base
,请列出包裹.最好的答案至少涉及一些代码; 如果使用请提供.
请注意,我不是在询问是否可以覆盖已存在的函数.这个问题已在SO上得到解决:
有关此处某些答案的可视化,请在简历中查看此问题:
https://stats.stackexchange.com/questions/13999/visualizing-2-letter-combinations
这是一个普遍公认的事实,R的基本重塑命令是快速而强大的,但具有悲惨的语法.因此,我已经编写了一个快速包装器,我将把它放到taRifx
包的下一个版本中.然而,在我这样做之前,我想要求改进.
这是我的版本,来自@RichieCotton的更新:
# reshapeasy: Version of reshape with way, way better syntax
# Written with the help of the StackOverflow R community
# x is a data.frame to be reshaped
# direction is "wide" or "long"
# vars are the names of the (stubs of) the variables to be reshaped (if omitted, defaults to everything not in id or vary)
# id are the names of the variables that identify unique observations
# vary is the variable that …
Run Code Online (Sandbox Code Playgroud) 我同样可以提出这个问题,"这对CRAN来说是否足够好?"
我有一系列我为特定任务建立的功能.其中一些是便利功能:
# Returns odds/evens from a vector
odds=function(vec) {
stopifnot(class(vec)=="integer")
ret = vec[fpart(vec/2)!=0]
ret
}
evens=function(vec) {
stopifnot(class(vec)=="integer")
ret = vec[fpart(vec/2)==0]
ret
}
Run Code Online (Sandbox Code Playgroud)
有些是次要的补充,已经证明在回答常见的SO问题时非常有用:
# Shift a vector over by n spots
# wrap adds the entry at the beginning to the end
# pad does nothing unless wrap is false, in which case it specifies whether to pad with NAs
shift <- function(vec,n=1,wrap=TRUE,pad=FALSE) {
if(length(vec)<abs(n)) {
#stop("Length of vector must be greater than the magnitude of n \n") …
Run Code Online (Sandbox Code Playgroud) 我有一个包含一大堆杂项功能的包(请参阅如何处理不完美但有用的功能?).因为这些功能并不是特别相关,所以它们依赖于一大堆其他包.通常在整个包中只有一个函数使用另一个包.然而,如果我在DESCRIPTION文件中使用Imports,Suggests或Depends,每次加载包时都会加载整个包列表,即使任何给定用户只需要很少的包.
有没有办法只在使用特定函数时加载依赖项?我可以library()
自己调用函数内部,但这似乎是不好的做法,因为它没有告诉包管理系统什么,因此用户可能没有安装它.
来自help("NA")
:
还存在支持缺失值的其他原子向量类型的常量NA_integer_,NA_real_,NA_complex_和NA_character_:所有这些都是R语言中的保留字.
我的问题是为什么没有NA_logical_
或类似,以及如何处理它.
具体来说,我正在创建几个非常相似data.table
的大型s,它们应该是类兼容的,以便以后使用rbind
.当其中一个data.table
s缺少变量时,我正在创建该列,但将其设置为NA
特定类型的所有s.但是,对于合乎逻辑的我不能那样做.
在这种情况下,它可能并不重要(data.table
不喜欢将列从一种类型强制转换为另一种类型,但它也不喜欢添加行,所以我必须创建一个新表来保存rbound版本),但我很困惑至于为什么NA_logical_
逻辑上应该存在的,不是.
例:
library(data.table)
Y <- data.table( a=NA_character_, b=rep(NA_integer_,5) )
Y[ 3, b:=FALSE ]
Y[ 2, a:="zebra" ]
> Y
a b
1: NA NA
2: zebra NA
3: NA 0
4: NA NA
5: NA NA
> class(Y$b)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)
两个问题:
NA_logical_
存在,当它的亲戚呢?data.table
尽可能避免胁迫的情况下做些什么呢?我假设使用NA_integer_
在强制方面买了一点(它会强制我加入0L/1L的逻辑,这不是很糟糕,但并不理想.