我以为我会尝试在Scribe(Pablo Fernandez的Java成熟OAuth库)上编写一个R接口,作为一种在Java上刷新自己的方法(8年内未使用它),学习rJava和更好地利用Twitter API。但主要是因为它是星期五下午,我认为这很有趣。 :)
不幸的是我没有走得太远......
我下载了.jar file for scribe和commons-condec(它唯一的依赖项,我后来解压缩了)。我使用netbeans在Java中运行代码,使用他的twitter example可以正常工作。
只需遵循rJava文档,我就可以获得前几行代码:
# load R packages
library(rJava)
# Initialise
.jinit()
# Add class paths
d1 <- "C:/Users/Tony/Documents/R/java/scribe-1.1.0.jar"
d2 <- "C:/Users/Tony/Documents/R/java/commons-codec-1.4/"
.jaddClassPath(path=c(d1, d2))
但是scribe quick start guide表示需要以下内容:
// Java Code
OAuthService service = new ServiceBuilder()
.provider(TwitterApi.class)
.apiKey("6icbcAXyZx67r8uTAUM5Qw")
.apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
.build();
我无法弄清楚如何将其重写为rJava用语。一点点网络搜索建议我应该部分地进行,所以首先我做了:
# Create object (back to R code again)
( service <- .jnew("org.scribe.builder.ServiceBuilder") )
[1] "Java-Object{org.scribe.builder.ServiceBuilder@58fe64b9}"
# Set up apiKey and apiSecret using "$" shortcut
service$apiKey("6icbcAXyZx67r8uTAUM5Qw")
service$apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
到目前为止很好。然后我需要弄清楚提供者函数的预期返回类型:
# Inspect return type
.jmethods(service, "provider")
[1] "public org.scribe.builder.ServiceBuilder org.scribe.builder.ServiceBuilder.provider(java.lang.Class)"
它需要“java.lang.Class”。这是我感到困惑的地方。那是什么意思?我想,看source,它需要一个类型为“ServiceBuilder”的返回类型,但是怎么做呢?看完之后这是我最好的猜测吗?.jcall(注意:'use.true.class = TRUE'没有做任何事情):
> .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", method = "org.scribe.builder.ServiceBuilder.provider", "org.scribe.builder.api.TwitterApi")
Error in .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", :
method org.scribe.builder.ServiceBuilder.provider with signature (Ljava/lang/String;)Lorg.scribe.builder.ServiceBuilder; not found
有什么想法吗?
答案 0 :(得分:1)
在我看来,提供者方法返回ServiceBuilder并将Class作为参数。
在Java中,如果您将类名后跟.class放入代码中的类文字对象。如果您使用反射加载类,则可以通过其字符串名称引用类。我不确定它在R中是如何工作的,但在Java中语法是:
Class c = Class.forName("org.scribe.builder.api.TwitterApi");
这将类实例放入变量c中。然后你可以调用提供者方法:
service$provider(c);