首页 > 解决方案 > 避免在 Plotly (R) 中显示日语字符串的 JSON 错误/一次在一个变量上运行函数

问题描述

我对 R 和一般编程的初学者水平非常陌生,并试图弄清楚如何在 plotly 中获取 hovertext 以从我的数据框中显示日语字符串。在经历了字符编码地狱之后,我的事情大部分都解决了,但我被困在一个点上:让日文字符串显示在最终情节中。

plot_ly(df, x = ~cost, y = ~grossSales, type = "scatter", mode = "markers",
    hoverinfo = "text",
    text = ~paste0("Product name: ", productName,
                    "<br>Gross: ", grossSales, "<br> Cost: ", cost, 
                    )
    ) 

我遇到的问题是使用 'productName' 从数据框中返回日语字符串,这导致绘图无法呈现。DOM Inspector 的控制台显示 JSON 在字符串中遇到问题(即使它只是以 UTF-8 编码)。

使用 toJSON(productName),我可以渲染表格,但是这会渲染带有 productName 列的完整信息的悬停文本框(例如,["","Product1","Product2","Product3"...] )。我只想要那个特定产品的名称;正如 'grossSales' 和 'cost' 在图上的每个点只返回一个特定于该产品的数据。

有没有一种方法可以仅在“productName”的每个特定实例上执行 toJSON()?(即,输出应该是 JSON 友好字符串格式的“Product1”)或者,有没有一种方法可以让我有情节地读取列表输出并只选择正确的产品名称?

标签: rplotlycjkr-plotlyjsonlite

解决方案


离开问题继续研究其他事情,我找到了使用 for 循环的部分解决方案:

productNames <- NULL
for (i in 1:nrow(df))
{
    productNames <- c(productNames, toJSON(df[i, "productName"]))
}
df$jsonProductNames <- productNames

在 plotly 中使用 jsonProductNames 变量,该图仅呈现并显示每个产品的名称!剩下的唯一问题是它以 JSON [""] 格式围绕每个产品的名称显示。

更新:

我终于按照我想要的方式完成了这项工作。我想有更优雅的解决方案,如果可能的话,我仍然有兴趣了解如何实现我最初看到的内容(每次在循环中遇到它时在 R 中的变量上运行一个函数),但是在这里我是如何工作的:

colToJSON <- function(df, colStr)
{
    JSONCol <- NULL
    for (i in 1:nrow(df))
    {
        JSONCol <- c(JSONCol, toJSON(df[i, colStr]))
    }
    JSONCol <- gsub("\\[\"", "", JSONCol)
    JSONCol <- gsub("\"\\]", "", JSONCol)
    return(JSONCol)
}

df$jsonProductNames <- colToJSON(df, "productName")

推荐阅读