避免 JSON 在 Plotly (R) 中显示日文字符串时出错 / 运行 一个函数一次处理一个变量
Avoiding JSON error displaying Japanese strings within Plotly (R) / Running a function on one variable at a time
我是 R 的新手,总体上处于编程的初学者水平,并且试图弄清楚如何在 plotly 中获取 hovertext 以从我的数据框中显示日文字符串。通过 character encoding hell 冒险之后,我的大部分工作都解决了,但我卡在了一个点上:让日文字符串显示在最终情节中。
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' returns dataframe中的日语字符串,导致绘图无法渲染。 DOM Inspector 的控制台显示 JSON 遇到字符串问题(即使它只是以 UTF-8 编码)。
使用 JSON(productName),我能够呈现 table,但是这会呈现带有 productName 列的完整信息的悬停文本框(例如,["","Product1"、"Product2"、"Product3"...])。我只想要那个特定产品的名称;就像 'grossSales' 和 'cost' 一样,只有 return 一个特定于该产品在图上每个点的数据。
有没有一种方法可以仅在 'productName' 的每个特定实例上执行 toJSON()? (即,输出应该是 "Product1" 和 JSON 友好的字符串格式)或者,有没有一种方法可以让我有计划地读取列表输出并且 select 只有正确的产品名称?
抛开问题继续研究其他东西,我找到了使用 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")
我是 R 的新手,总体上处于编程的初学者水平,并且试图弄清楚如何在 plotly 中获取 hovertext 以从我的数据框中显示日文字符串。通过 character encoding hell 冒险之后,我的大部分工作都解决了,但我卡在了一个点上:让日文字符串显示在最终情节中。
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' returns dataframe中的日语字符串,导致绘图无法渲染。 DOM Inspector 的控制台显示 JSON 遇到字符串问题(即使它只是以 UTF-8 编码)。
使用 JSON(productName),我能够呈现 table,但是这会呈现带有 productName 列的完整信息的悬停文本框(例如,["","Product1"、"Product2"、"Product3"...])。我只想要那个特定产品的名称;就像 'grossSales' 和 'cost' 一样,只有 return 一个特定于该产品在图上每个点的数据。
有没有一种方法可以仅在 'productName' 的每个特定实例上执行 toJSON()? (即,输出应该是 "Product1" 和 JSON 友好的字符串格式)或者,有没有一种方法可以让我有计划地读取列表输出并且 select 只有正确的产品名称?
抛开问题继续研究其他东西,我找到了使用 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")