- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 Web 应用程序,其中的模块使用工具 rpy2,其目的是在 Python 代码中调用和执行 R 脚本(因为我想增加应用程序模块化)。
我的应用程序有一个客户端-服务器架构,它们之间的通信是通过 HTTP 请求进行的。我必须实现这一目标的工具是Flask。
现在,我有一个 R 脚本,其任务是执行聚类过程并返回以 JSON 格式转换的数据帧,为此我在 R 中使用了 jsonlite。我的问题从这里开始。问题是Python代码中这个R脚本的返回是一个ListVector。
我不知道,但在这种格式下 python 会得到 R 脚本结果。所以我真的不知道如何从 python 将此结果(ListVector)转换为 JSON 对象,因为最后我需要在我想要公开的服务中返回 JSON 对象。我尝试理解 rpy2 文档,但我不清楚 rpy2 documentation .
R 脚本
require(kohonen)
require(jsonlite)
group = read.csv2("/home/python_user/Documents/FlaskApp/FlaskApp/resources/data2.csv", header = T, sep = ",", fill = F)
group$X <- NULL
data_train <- group[, -c(3:8)]
###
data_train <- data_train[data_train$NumeroAdultos != 12094,]
data_train$lat <- as.numeric(as.character(data_train$lat))
data_train$lon <- as.numeric(as.character(data_train$lon))
str(data_train)
#### Write JSON K-means #######
cl <- kmeans(data_train, 5)
cl$cluster
result <- data_train[,1:2]
result <- cbind(result, colorCluster = cl$cluster)
result$colorCluster[result$colorCluster == 1] <- "red"
result$colorCluster[result$colorCluster == 2] <- "blue"
result$colorCluster[result$colorCluster == 3] <- "green"
result$colorCluster[result$colorCluster == 4] <- "orange"
result$colorCluster[result$colorCluster == 5] <- "yellow"
toJSON(result, pretty = TRUE)
主程序.py
from flask import Flask, send_file, jsonify, send_from_directory, render_template, Blueprint, request
import json
import rpy2.robjects as robjects
@map_module.route("/serviceData")
def service_data():
r = robjects.r
result = r.source(map_module.root_path + "/R/clustering.R")
return result
控制台结果
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/flask/app.py", line 1615, in full_dispatch_request
return self.finalize_request(rv)
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/flask/app.py", line 1630, in finalize_request
response = self.make_response(rv)
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/flask/app.py", line 1740, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/werkzeug/wrappers.py", line 885, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/werkzeug/wrappers.py", line 57, in _run_wsgi_app
return _run_wsgi_app(*args)
File "/home/python_user/Documentos/flaskEnv/local/lib/python3.4/site-packages/werkzeug/test.py", line 884, in run_wsgi_app
app_rv = app(environ, start_response)
TypeError: 'ListVector' object is not callable
127.0.0.1 - - [24/Mar/2017 17:32:36] "GET /serviceData HTTP/1.1" 500 -
下面一行显示了存储 R 脚本返回结果的“结果”变量,调用 R 脚本时该变量的值是 ListVector,而不是 JSON 对象。
result = r.source(map_module.root_path + "/R/clustering.R")
感谢您阅读我的文章。
最佳答案
我一直在尝试解决这个问题,但我找到了一个对我来说不是最好的解决方案。所以解决方案是,从 R 脚本返回 JSON 对象,使用 python 获取并使用库 JSON 和服务 json.load 作为列表(python 对象)加载。完成此操作后,您将拥有一个 python 对象(作为列表,但具有 JSON 结构),因此最终将此列表转换为 python 中的 JSON 对象。请记住,问题是 R 脚本在 python 中返回一个 ListVector,并且该对象在 python 中不可调用。
最终结果
R-Sript(我纠正了一些东西,但本质或结构是一样的)
# K-means Clustering
require(jsonlite)
# Read the data
group = read.csv2("/home/python_user/Documents/FlaskApp/FlaskApp/resources/data2.csv", header = T, sep = ",", fill = F)
# Prepare the data
group$X <- NULL
group <- group[, -c(3:8)]
group <- group[group$NumeroAdultos != 12094,]
group$lat <- as.numeric(as.character(group$lat))
group$lon <- as.numeric(as.character(group$lon))
# Excute the K-means algorithm
cl <- kmeans(group[,3:9], 5)
# Bind the data with its number cluster
group <- group[,1:2]
group <- cbind(group, colorCluster = cl$cluster)
# Change conventions
group$colorCluster[group$colorCluster == 1] <- "red"
group$colorCluster[group$colorCluster == 2] <- "blue"
group$colorCluster[group$colorCluster == 3] <- "green"
group$colorCluster[group$colorCluster == 4] <- "orange"
group$colorCluster[group$colorCluster == 5] <- "yellow"
# Convert the data frame to JSON object
toJSON(group, pretty=FALSE)
主程序.py
from flask import Flask, send_file, jsonify, send_from_directory, render_template, Blueprint, request
import json
import rpy2.robjects as robjects
@map_module.route("/getEntomoClustering", methods=['GET'])
def clustering():
r = robjects.r
dataR = r.source(map_module.root_path + "/R/clustering.R")[0][0]
clusters = json.loads(dataR)
return jsonify(clusters)
控制台结果
[
{
"colorCluster": "red",
"lat": 3.8946,
"lon": -76.2884
},
{
"colorCluster": "red",
"lat": 3.8988,
"lon": -76.2904
},
{
"colorCluster": "red",
"lat": 3.9008,
"lon": -76.2904
},
{
"colorCluster": "red",
"lat": 3.9034,
"lon": -76.2916
},
{
"colorCluster": "red",
"lat": 3.8934,
"lon": -76.2916
},
{
"colorCluster": "red",
"lat": 3.9067,
"lon": -76.2941
},
{
"colorCluster": "red",
"lat": 3.8972,
"lon": -76.2947
},
{
"colorCluster": "red",
"lat": 3.8948,
"lon": -76.2964
},... ]
要考虑到,R脚本的结果是一个ListVector,在其中它找到用R转换的数据Json,但在python中不是可调用对象。为此,我访问该数据 JSON,并且我知道它具有 JSON 结构,因此我使用服务 json.load 并获取列表(python 对象),最终使用服务 jsonify 再次转换为 JSON 对象(该对象可以是用Python对象处理,可调用)
dataR = r.source(map_module.root_path + "/R/clustering.R")[0][0] //JSON data from R is not callable
clusters = json.loads(dataR) // load a list, python object
return jsonify(clusters) // convert to JSON object callable
对此解决方案有任何疑问都可以问我。感谢您的阅读。
关于python - Rpy2,将R返回(List Vector)转换为Python中的Json对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010705/
我有这个析构函数,它在运行时产生错误“vector 迭代器不可取消引用”。 gridMatrix 是一个 std::vector * > * > * > * > 我添加了 typename 和 typ
我有一个 vector 的 vector ,比方说 std::vector > my2dArray; 现在我想要一个 vector ,其中包含 my2dArray 中 vector 的大小。手动这看起
假设我有一些 vector :v1、v2、v3 假设我还有一个 vector 来保存这些 vList = {v1, v2, v3} 如果我同步了 (vList),这是否意味着 v1、v2 和 v3 也
我正在创建一个 char 的二维 vector 数组作为类变量,但我在将 vector 添加到 vector 数组中时遇到了麻烦。 我正在使用 C++ 11 标准运行 gcc。 我尝试使用 vecto
如何修改 Vec基于 Vec 中某项的信息没有对向量的不可变和可变引用? 我已尝试创建一个最小示例来演示我的特定问题。在我的真实代码中,Builder struct 已经是其他答案提出的中间结构。具体
这个问题在这里已经有了答案: What is the idiomatic Rust way to copy/clone a vector in a parameterized function? (
在我的程序中,我有一个整数 vector 的 vector 。现在我想从 vector 的 vector 中取出一个 vector 并在另一个 vector 容器中对其进行操作,但是我得到了错误...
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
我有一个函数,该函数应使用来自字符串类型的给定 vector vector 中的某些元素初始化来自字符串类型的空 vector vector 。我的语法看起来像这样 std::vector> extr
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
这里有很多类似的问题,但我没有真正找到任何可以特别回答我的问题的问题。 我有一个 vector 的 vector 作为类的属性。另一个属性是 bucket_count。我想将 vector 的 vec
如果我像这样创建一个 vector 的 vector : std::vector> myVectorOfVectors; 然后用一些东西填充它: std::vector myVector1; myVe
我正在用 C++ 编写自定义 vector 类。我对这样的代码有疑问: vector vec; vec.push_back(one); vec.push_back(two);
这是我发布的问题 c++ program for reading an unknown size csv file (filled only with floats) with constant (b
vector> a; for (int i=0;i v(i+1); iota(v.begin(),v.end(),1); a.push_back(v); } a.erase(a.beg
也许已经晚了,但我不明白为什么我会得到一个超出此代码范围的 vector 下标: int m = 3; int n = 2; std::vector> path(m, std::vector(n, 0
这个问题真的很奇怪,我似乎找不到任何导致它的原因。 所以这里有一个赋值运算符重载函数,鸟类和哺乳动物都是 vector 。 (下面是类) const Register& Register::opera
我怎么去 std::vector> 只是 std::vector> ?有真正有效的方法吗? 最佳答案 我会做这样的事情: #include #include int main() { //
我正在尝试将这些 vector 中的一些数据写入文本文件。当我运行代码时,它返回运行时错误。 Category、Product、Cart、Customer和Address都是struct 包含每个 g
显然它会因您使用的编译器而异,但我很好奇执行 vector> 时的性能问题与 vector*> ,尤其是在 C++ 中。具体来说: 假设您的外部 vector 已满,您想要开始将元素插入到第一个内部
我是一名优秀的程序员,十分优秀!