Я не уверен, как улучшить ответ @ alexis за пределами того, что @Frank уже сделал, но ваш оригинальный подход с базой R был не слишком далек от чего-то, что достаточно эффективно.
Вот вариант вашего подхода, который мне понравился, потому что (1) он достаточно быстр и (2) он не требует слишком много размышлений, чтобы выяснить, что происходит:
as.matrix(dat)[cbind(1:nrow(dat), max.col(!is.na(dat), "last"))]
Самой дорогой частью этого является часть as.matrix(dat)
, но в остальном она кажется более быстрой, чем melt
подход, которым поделился @akrun.
Переменная name
, но вы использовали person
, поэтому она находит элемент с идентификатором person
, поскольку они не являются переменными person
.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Challenge: Mad Libs</title>
</head>
<body>
<h1>Mad Libs</h1>
<ul>
<li>Noun: <input type="text" id="noun"></li>
<li>Adjective: <input type="text" id="adjective"></li>
<li>Someone's Name: <input type="text" id="person"></li>
</ul>
<button id="lib-button">Lib it!</button>
<p>Generated story:
<span id="story"></span>
</p>
<script>
var libButton = document.getElementById('lib-button');
var libIt = function() {
var storyDiv = document.getElementById("story");
var noun = document.getElementById("noun").value;
var adjective = document.getElementById("adjective").value;
var name = document.getElementById("person").value;
storyDiv.innerHTML = "I took my " + noun + " and " +
adjective + " it. "+ name + " didn't like it.";
};
libButton.addEventListener('click', libIt);
</script>
</body>
</html>